EF代码在映射实体中具有外键的第一实体映射

问题描述 投票:0回答:1

Demo Model(来源:mcainsh.info

这些表仅作为示例,我想要做的是在Book实体中映射虚拟制造商。我尝试使用类似于以下内容的数据注释:

[ForeignKey("PublisherId")]
public virtual Publisher { get; set; }

[ForeignKey("Publisher.ManufacturerCompanyId")]
[InverseProperty("ManufacturerId")]
public virtual Manufacturer { get; set; }

这可以做吗?

entity-framework ef-code-first data-annotations
1个回答
1
投票

您配置的外键错误。做你想做的,你的模型应该是这样的:

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; }
}

在此模型中,您有两个一对多的关系,第一个在BookPublisher之间,第二个在BookManufacturer之间。在Book类中可以看到,如果要使用FK属性,则必须声明与相关实体PK相同类型的属性(请参见PublisherIdManufacturerId)。现在,您可以将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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.