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

相关问题