2008-10-13 83 views
5

我想在一個有兩個外鍵關係的表上的數據庫中創建一個新行,我還沒有能夠獲得什麼順序和需要做什麼調用的句柄。這是我到目前爲止有:如何創建與實體框架的外鍵關係?

db.Models.Order order = DB.Models.Order.CreateOrder(apple); 
order.CustomerReference.Attach((from c in db.Customer where c.Id == custId select c).First()); 
db.SaveChanges(); 

的代碼在第二行沒有出現,他說:

連接是不能當這個 相關終端相關 源對象的有效操作處於添加,刪除, 或分離狀態。使用NoTracking合併選項加載 的對象始終分離爲 。

任何想法?

回答

8

(感謝約翰語法修復)

所以我想通了。這是你必須做的:

db.Models.Order order = DB.Models.Order.CreateOrder(apple); 
order.Customer = (from c in db.Customer where c.Id == custId select c).First(); 
db.SaveChanges(); 

我希望能幫助別人。

6

爲什麼不使用實體引用?您的方法將會導致額外的SELECT聲明。

更好的方法是使用CustomerReference類和EntityKey

order.CustomerReference = new System.Data.Objects.DataClasses.EntityReference<Customers>(); 
order.CustomerReference.EntityKey = new EntityKey("ModelsEntities.Customers", "Id", custId); 
+1

我不介意使用您的解決方案,但我想用強類型的數據庫列名,所以我可以編譯時錯誤如果關係無效。 – Jared 2009-01-03 00:15:36

0

對於更新下面是一些示例代碼:

using (var ctx = new DataModelEntities()) 
{ 

     var result = (from p in ctx.UserRole.Where(o => o.UserRoleId == userRole.UserRoleId) 
           select p).First(); 

     result.RolesReference.EntityKey = new EntityKey("DataModelEntities.Roles", 
             "RoleId", userRole.RoleId); 

     result.UserRoleDescription = userRole.UserRoleDescription;  
     ctx.SaveChanges(); 
}