Змены ў базе дадзеных былі здзейснены паспяхова, але адбылася памылка падчас абнаўлення кантэксту аб'екта

У мяне ёсць дадатак WinForms, якое выкарыстоўвае EF5, .NET 4 і SQL Server 2008. У мяне ёсць наступныя табліцы \ аб'ект у базе дадзеных. T-SQL для стварэння табліц прыведзены ніжэй.

CREATE TABLE [Admin].[StandardTerms](
    [StdTermID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Description] [nvarchar](100) NOT NULL,
 CONSTRAINT [PK_StandardTerms] PRIMARY KEY CLUSTERED 
(
    [StdTermID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Я выкарыстоўваю аб'ект BindingSource на форме, якая звязаная з сеткай дадзеных, што дазваляе карыстальнікам ствараць новыя стандартныя ўмовы. Калі карыстальнік стварае новы стандартны тэрмін і спрабуе выратаваць яго, я атрымліваю наступнае паведамленне пра памылку.

<�Р> Змены ў базе дадзеных былі здзейснены паспяхова, але адбылася памылка падчас абнаўлення кантэксту аб'екта. ObjectContext можа знаходзіцца ў няўстойлівым стане. Ўнутранае паведамленне выключэнне: AcceptChanges не можа працягвацца, таму што ключавыя каштоўнасці канфлікту аб'екта з іншым аб'ектам у ObjectStateManager. Пераканайцеся, што ключавыя каштоўнасці з'яўляюцца унікальнымі перад выклікам AcceptChanges.

Першасны ключ для стандартнага тэрміна табліцы ўяўляе сабой цэлы лік, аўтаматычна генеруюцца. Я праверыў SSDL і пераканаўся, што StoreGeneratedPattern вызначаецца на твары.


    
        
    
    
    
    

Дзіўна тое, што гэта адбываецца толькі тады, калі я ствараю стандартны тэрмін з сеткі. Я магу выкарыстоўваць свой рэпазітар, каб стварыць адну, і яна працуе проста выдатна. Я магу нават стварыць сапраўды такую ​​ж структуру звязвання крыніцы, і яна працуе без памылак. На дадзены момант я ў тупіку. Хто-небудзь ёсць якія-небудзь ідэі аб тым, што можа быць тут адбываецца?

4
Ёсць параметр у StdTermID перад адпраўкай яго ў базу дадзеных?
дададзена аўтар Luke McGregor, крыніца
Не. У слупку StdTermID ня паказваецца карыстальніку ў сетцы, і я нічога да яго ў кодзе не рабіць. Я мяркую, што (і гэта звычайна атрымлівае мяне ў бядзе), што любы новы стандарт тэрмін суб'ект атрымаў бы створаны са значэннем па змаўчанні 0. Як гаворыцца ў паведамленні пра памылку, элемент дадаецца ў табліцу базы дадзеных. EF, здаецца, ёсць праблемы з атрыманнем ключа, які быў прызначаны на элемент, калі ён быў створаны.
дададзена аўтар Brad Overstreet, крыніца
Не. У слупку StdTermID ня паказваецца карыстальніку ў сетцы, і я нічога да яго ў кодзе не рабіць. Я мяркую, што (і гэта звычайна атрымлівае мяне ў бядзе), што любы новы стандарт тэрмін суб'ект атрымаў бы створаны са значэннем па змаўчанні 0. Як гаворыцца ў паведамленні пра памылку, элемент дадаецца ў табліцу базы дадзеных. EF, здаецца, ёсць праблемы з атрыманнем ключа, які быў прызначаны на элемент, калі ён быў створаны.
дададзена аўтар Brad Overstreet, крыніца

6 адказы

Я нарэшце знайшоў маю праблему і, як я падазраваў, што гэта было што-то па-дурному я зрабіў. У маёй мадэлі я будавала запыт, загрузка значэння і вяртае BindingList. Тое, што я зрабіў, каб выправіць гэта, каб праверыць, калі мой BindingList быў нулявым, калі б гэта быў я пабудаваў запыт, пагрузілі значэння і стварыў Binding спіс.

арыгінальны код

public BindingList StandardTerms
{
    get
    {
        _uow.StandardTerms.FindAll().Load();
        _standardTerms = _uow.StandardTerms.GetBindingList();
    }
}

правільны код

public BindingList StandardTerms
{
    get
    {
        if (_standardTerms == null)
        {
            _uow.StandardTerms.FindAll().Load();
            _standardTerms = _uow.StandardTerms.GetBindingList();
        }

        return _standardTerms;
    }
}

Мой рэпазітар клас рэалізуе метад GetBindingList, які паказаны ніжэй.

protected DbSet _set;
public BindingList GetBindingList()
{
    return _set.Local.ToBindingList();
}

усе Мае аб'екты належаць на ObservableListSource, які апісаны ў наступнай артыкуле MDSN.

EF DataBinding з WinForms

2
дададзена

Я нарэшце знайшоў маю праблему і, як я падазраваў, што гэта было што-то па-дурному я зрабіў. У маёй мадэлі я будавала запыт, загрузка значэння і вяртае BindingList. Тое, што я зрабіў, каб выправіць гэта, каб праверыць, калі мой BindingList быў нулявым, калі б гэта быў я пабудаваў запыт, пагрузілі значэння і стварыў Binding спіс.

арыгінальны код

public BindingList StandardTerms
{
    get
    {
        _uow.StandardTerms.FindAll().Load();
        _standardTerms = _uow.StandardTerms.GetBindingList();
    }
}

правільны код

public BindingList StandardTerms
{
    get
    {
        if (_standardTerms == null)
        {
            _uow.StandardTerms.FindAll().Load();
            _standardTerms = _uow.StandardTerms.GetBindingList();
        }

        return _standardTerms;
    }
}

Мой рэпазітар клас рэалізуе метад GetBindingList, які паказаны ніжэй.

protected DbSet _set;
public BindingList GetBindingList()
{
    return _set.Local.ToBindingList();
}

усе Мае аб'екты належаць на ObservableListSource, які апісаны ў наступнай артыкуле MDSN.

EF DataBinding з WinForms

2
дададзена

I got this error when I forgot to mark one of the multi-column-primary-key fields as [Key]

0
дададзена

I got this error when I forgot to mark one of the multi-column-primary-key fields as [Key]

0
дададзена

Another one option yielding such error message is INSTEAD OF trigger adding a resultset with no Id column on it. E.g.: http://i.stack.imgur.com/3GXUw.png

І Entity Framework, запытваючы наступнае не атрымае слупок Id.

insert [dbo].[Xxxx]([XxxxId], [FirstName], [LastName], [ProfileUrl], 
        [LastModified], [PictureUrl], [Headline])
values (@0, @1, @2, null, @3, null, null)
select [Id], [Revision]
from [dbo].[Xxxx]
where @@ROWCOUNT > 0 and [Id] = scope_identity()

Fix, каб дадаць слупок Id у RS.

0
дададзена

Another one option yielding such error message is INSTEAD OF trigger adding a resultset with no Id column on it. E.g.: http://i.stack.imgur.com/3GXUw.png

І Entity Framework, запытваючы наступнае не атрымае слупок Id.

insert [dbo].[Xxxx]([XxxxId], [FirstName], [LastName], [ProfileUrl], 
        [LastModified], [PictureUrl], [Headline])
values (@0, @1, @2, null, @3, null, null)
select [Id], [Revision]
from [dbo].[Xxxx]
where @@ROWCOUNT > 0 and [Id] = scope_identity()

Fix, каб дадаць слупок Id у RS.

0
дададзена