如何在Entity Framework模型中正确定义一对多关系?

时间:2017-12-23 15:20:34

标签: c# entity-framework

我在数据库中有两个实体:客户和用户,并在它们之间建立一对多的关系,因此1个客户 - >很多用户。

这是我的客户模式:

public class Customer
{           
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public ICollection<User> Users { get; set; }
}

什么是正确的用户模型,我的意思是Customer属性和CustomerId属性或只是CustomerId?所以这个:

public class User
{       
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public Customer Customer { get; set; }

    [ForeignKey("Customer")]
    public int CustomerId { get; set; }
}

..还是这个?:

public class User
{       
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [ForeignKey("Customer")]
    public int CustomerId { get; set; }
}

2 个答案:

答案 0 :(得分:2)

实际上它应该像下面的代码示例。您应该指定什么是本地主键,远程键以及是否有导航属性(Customer),那么您应该指定&#34;它应该如何识别对象&#34; =&GT;基于客户的这个或那个密钥(CustomerId)。

public class User
{       
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //other properties

    [ForeignKey("CustomerId")]
    public Customer Customer { get; set; }

    public int CustomerId { get; set; }
}

如果您对导航属性不感兴趣,可以简单地避免只有:

public class User
{       
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //other properties

    public int CustomerId { get; set; }
}
  

可以在那里找到更多信息:http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

注意:如果您使用[ForeignKey]具有相同的名称(例如Navigation Property&amp; Customer),则无需指定CustomerId属性。

如果对同一个类有多个引用(例如,您的用户只有2个客户(CustomerA,CustomerB),那么您必须指定以下内容:

public class User
{       
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //other properties


    [ForeignKey("CustomerIdA")]
    public Customer CustomerA { get; set; }
    public int CustomerIdA { get; set; }

    [ForeignKey("CustomerIdB")]
    public Customer CustomerB { get; set; }
    public int CustomerIdB { get; set; }
}

答案 1 :(得分:1)

在第一种情况下,您在User和Customer之间具有正确设置的导航属性。在第二种情况下,您无法从“用户”导航到“客户”,并且您具有指向不存在的属性的Foreign Key属性。

但是,您应该反转ForeingKeyAttribute的顺序以使其更清晰(但两种方式都可以):

[ForeignKey("CustomerId")]
public Customer Customer { get; set; }

public int CustomerId { get; set; }

如果您不需要User.Customer,则可以完全跳过设置导航属性。这同样适用于Customer.Users,如果不需要,您可以跳过设置该导航属性。