2011-02-17 102 views
4

我有兩個類:EF插入重複父對象

public class Foo 
{ 
    public int FooId {get;set;} 
    public virtual ICollection<Bar> Bars {get;set;} 
} 

public class Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo {get;set;} 
} 

如果我運行下面的代碼,我得到一個FooId Foreign Key Conflict

var foo = from f in context.Foos 
      where f.FooId == 1 
      select f; 

var bar = new Bar(); 
bar.Foo = foo; 

context.Bars.Add(bar); 
context.SaveChanges(); 

如果我禁用SQL所有關鍵的檢查,我結束了與數據庫中的一個重複Foo

+1

什麼版本的實體框架? 4.0代碼第一? –

+0

是的,EF代碼優先4. – mattdwen

回答

1

加載foo相同的上下文與相關foo添加新bar不會造成複製。我的猜測是你的真實代碼使用兩種不同的上下文。

唯一的代碼來改變(這不能編譯,因爲foo是一個IQueryable<Foo>而不是Foo)是物化爲foo,例如:

var foo = (from f in context.Foos 
      where f.FooId == 1 
      select f).Single(); 

比代碼片段其他很好。

+0

是的,我正在使用DI,內容實例每次都是從頭開始生成的。 #numpty – mattdwen

0

嘗試

var bar = new Bar(); 
context.Bars.Add(bar); 
bar.Foo == foo; 
context.SaveChanges(); 

這似乎是實體按鍵不被唯一設定當實體被添加到上下文之前發生的分配。

+0

我現在正在'當IDENTITY_INSERT設置爲OFF時無法在表'Bar'中插入標識列的顯式值 – mattdwen

+0

@mattdwen在打開IDENTITY_INSERT ON時出現問題嗎? – Noel

+0

是的,因爲ID是由數據庫自動生成的。如果我設置了「IDENTITY_INSERT ON」,則ID被插入爲「0」。 – mattdwen

0

不知道這是最好的做法,但是當我遇到了這個問題,我結束了設置父實體爲Null,但維護任何FK參考,這停止了母公司被插在子實體:

var bar = new Bar(); 
context.Bars.Add(bar); 
bar.Foo == null; 
bar.FooId = existingFooParent.Id; 
context.SaveChanges(); 
1

我認爲你正在以錯誤的方式接近問題。你想在新的酒吧對象添加到您現有的Foo對象,而不是倒過來:

var foo = from f in context.Foos 
      where f.FooId == 1 
      select f; 

var bar = new Bar(); 
foo.Bars.Add(bar); 

context.SaveChanges();