(来源:mcainsh.info)
这些表仅作为示例,我想要做的是在Book实体中映射虚拟制造商。我尝试使用类似于以下内容的数据注释:
[ForeignKey("PublisherId")]
public virtual Publisher { get; set; }
[ForeignKey("Publisher.ManufacturerCompanyId")]
[InverseProperty("ManufacturerId")]
public virtual Manufacturer { get; set; }
这可以做吗?
您配置的外键错误。做你想做的,你的模型应该是这样的:
public class Book
{
public int Id { get; set; }
public string Title{ get; set; }
public int PublisherId { get; set; }
[ForeignKey("PublisherId")]
public virtual Publisher Publisher{ get; set; }
public int ManufacturerId { get; set; }
[ForeignKey("ManufacturerId")]
public virtual Manufacturer Manufacturer { get; set; }
}
public class Manufacturer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Publisher
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
在此模型中,您有两个一对多的关系,第一个在Book
和Publisher
之间,第二个在Book
和Manufacturer
之间。在Book
类中可以看到,如果要使用FK属性,则必须声明与相关实体PK相同类型的属性(请参见PublisherId
和ManufacturerId
)。现在,您可以将ForeignKey
批注应用到navigation属性,并告诉它哪个属性是关系的外键,如我上面所示。另外,您可以将ForeignKey
属性添加到ManufacturerId
,并附带告诉它哪个导航属性表示它是外键关系的信息:
[ForeignKey("Manufacturer")]
public int ManufacturerId { get; set; }
public virtual Manufacturer Manufacturer { get; set; }
[如果需要,您不需要创建FKs属性,EF会为您开始场景创建工作。它将在Books
表中为每种关系创建FK行(执行代码后检查数据库):
public class Book
{
public int Id { get; set; }
public string Title{ get; set; }
//public int PublisherId { get; set; }
//[ForeignKey("PublisherId")]
public virtual Publisher Publisher{ get; set; }
//public int ManufacturerId { get; set; }
//[ForeignKey("ManufacturerId")]
public virtual Manufacturer Manufacturer { get; set; }
}