2011-08-18 156 views
0

這應該是一個簡單的涉及EF代碼的第一,但我不能包裝我的頭周圍的文檔,我發現所有的例子是從舊版本。我正在使用最新的(4.1)。EF代碼優先與兩個DbContexts

反正我有一些車型,如:

public class Foo 
{ 
    public int ID { get; set; } 
    public Bar Bar { get; set; } 
} 

public class Bar 
{ 
    public int ID { get; set; } 
    public string Value { get; set; } 
} 

我使用了一些腳手架與Asp.Net MVC創建我的控制器/存儲庫,當我創建一個「富」的對象,還創建了一個「酒吧」對象,即使我從存儲在數據庫中的東西設置'Bar'屬性。

public class FooViewModel 
{ 
    public int ID { get; set; } 
    public int BarID { get; set; } 
} 

public ActionResult Create(FooViewModel foo) 
{ 
    var entity = new Foo() 
     { 
      ID = foo.ID, 
      Bar = _barRepository.Find(foo.BarID) 
     }; 
    _fooRepository.InsertOrUpdate(entity); 
    _fooRepository.Save(); 
    // more stuff 
} 

如何使用EF的流利語法來阻止它在數據庫中創建新的'Bar'行?

更新

這裏是生成的庫代碼:

public void InsertOrUpdate(Foo foo) 
    { 
     if (foo.ID == default(int)) { 
      // New entity 
      context.Foo.Add(foo); 
     } else { 
      // Existing entity 
      context.Foo(foo).State = EntityState.Modified; 
     } 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 
+1

您的_fooRepository和_barRepository共享相同的數據庫上下文實例嗎? –

+0

Doh ......是的,那是問題所在。我在想,它會查看Bar對象的主鍵而不是一些神奇的EF實體跟蹤。另外,我認爲這兩個存儲庫會共享一個上下文。當我添加IOC時,我可以設置它來做到這一點。如果你願意的話,你可以回答這個問題,這樣我就可以關閉它。 –

回答

2

您的_fooRepository和_barRepository需要共享相同的數據庫上下文實例。如果使用兩個實例,Bar將處於添加狀態。

0

問題一定在你的倉庫層 - 使用相同型號與EF 4.1直接產生預期的結果 - 新在Foos表中用一列FK列指向現有的欄。

+0

我更新了帖子以包含存儲庫代碼。 –