我在数据库中有两个实体:客户和用户,并在它们之间建立一对多的关系,因此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; }
}
答案 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
,如果不需要,您可以跳过设置该导航属性。