2012-08-13 28 views
0

我有兩個實體 - 項目和項目類型鏈接相關實體在EF

項目有-ID,TYPEID,名 項目類型有 - ID,姓名

TYPEID是項目和項目類型表

之間的外鍵

說現在我手頭上有一個對象做這樣的事情後,下面

var selprojtype = db.ProjectTypes.Single(p => p.Name == id); 

然後我說我創建一個新的項目w^HICH我想,如果我做

project.ProjectType = selprojtype; 

沒有設置TYPEID鏈接到的項目類型

Project project = new Project(); 

。因此,在調用SaveChanges方法之前,我總是最終專門設置外鍵。

project.TypeId= selprojecttype.ID 

有沒有更好的方法來鏈接相關實體?

+0

您不需要設置外鍵屬性'TypeId'。當您保存更改時,EF將存儲正確的FK。 – Slauma 2012-08-13 15:54:44

+0

因此它沒有問題。 – superartsy 2012-08-13 16:32:11

+0

當你調用'SaveChanges'時你會遇到異常嗎?你可以將代碼的完整上下文顯示給SaveChanges和模型類嗎?你使用'DbContext'還是'ObjectContext'? – Slauma 2012-08-13 16:57:45

回答

0

在建立對象之間的關係之前,兩個對象必須位於同一個數據上下文中。所以,你的代碼應該閱讀:

var selprojtype = db.ProjectTypes.Single(p => p.Name == id); 
Project project = new Project(); 

//now add newly created project object to the context 
db.Projects.Attach(project); 

//now establish the relation 
project.ProjectType=selprojtype; 
+0

如果數據庫中沒有任何記錄與給定的id,這段代碼將拋出一個異常:db.ProjectTypes.Single(p => p.Name == id)。它應該是SingleOrDefault,以防在給定的id沒有任何記錄時返回null。 – 2012-08-14 05:14:26

0

你可以做的是這樣的:

public int? TypeId { get; set; } 
private ProjectType projectType; 
public ProjectType ProjectType{ 
    get { return projectType;} 
    set { 
      projectType = value; 
      TypeId = value != null ? value.Id : null; 
     } 
} 

這樣你直接控制FK當你分配的關係。