8

是否可以在實體框架4.1(代碼優先方法)中僅使用數據註釋而不使用模型構建器來定義多對多關係?實體框架4.1代碼優先 - 僅使用數據註釋定義多對多

例如,像:

Product = { Id, Name, ... } 
Category = { Id, Name, ... } 
ProductCategory = { ProductId, CategoryId } 

你得到的圖片。

我不希望在兩個多對一的上下文中有一箇中間實體ProductCategory,因爲我沒有任何附加數據,只有兩個FK。另外,我應該能夠爲中間表定義表名,以便與現有數據庫一起使用。

回答

11

可以使用默認約定或數據註釋定義多對多,但無法在沒有模型構建器的情況下將映射更改爲聯結表(表名和列)。簡單許多一對多:

public class Product 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

了使用註解,你可以使用:

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 
    [InverseProperty("Products")] 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    [Key] 
    public int Id { get; set; } 
    [InverseProperty("Categories")] 
    public virtual ICollection<Product> Products { get; set; } 
} 

如果你需要控制聯接表映射到現有的數據庫,你需要modelBuilder。數據註釋不如流利的API強大。

+0

謝謝,我按你的建議做了,但它仍然不起作用。出於某種原因,我得到一個異常'無效的列名'Category_Id'。\ r \ n當我嘗試評估'product.Categories'時,無效的列名'Product_Id'.'。這只是使用約定,即沒有註釋或流利的API。我的數據庫表'ProductsCategories'有'ProductId'和'CategoryId',兩者之間沒有下劃線。爲什麼是下劃線?它沒有記錄在任何地方作爲公約AFAIK。對於1-M和M-1關係,EF4.1不需要下劃線(至少它沒有記錄)。 – 2011-06-08 21:09:43

+0

Product_Id和Category_Id是默認名稱。如果您有現有數據庫並且名稱不同,則必須使用模型構建器將關係正確映射到您自己的表。 – 2011-06-08 21:47:34

+0

你說得對。但是,在其他使用1-M關係的地方,它預計FK字段*不帶*下劃線(即'ProductId')。這是沒有意義的**。實際上,這意味着如果稍後向ProductCategories中間表添加另一個字段(例如「Ord」),它將成爲一個真正的實體,然後該公約會抱怨找不到字段「ProductId」。 – 2011-06-08 22:19:51

相關問題