我有一个问题。
我有这两个表:
主表是具有客户依赖性的用户。
逆向工程师代码首先生成如下类:
public class User
{
public User()
{
this.Customers = new List<Customer>();
}
...
public virtual ICollection<Customer> Customers { get; set; }
}
public class Customer
{
public Customer()
{
}
...
public int UserID { get; set; }
public virtual User User { get; set; }
}
我在用户类中进行了以下修改:
public class User
{
public User()
{
}
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
}
因为这种关系是一对一或一对。
原始映射是:
// Relationships
this.HasRequired(t => t.User)
.WithMany(t => t.Customers)
.HasForeignKey(d => d.UserID);
修改后的映射是这样的:
this.HasRequired(t => t.User)
.WithOptional(t => t.Customer)
.Map(m => m.MapKey("UserID"));
这是对的吗? 如果没有,这个映射怎么样?
感谢。
答案 0 :(得分:2)
不,这不正确。
您可以做的最好的事情 - 假设您可以更改数据库模式 - 从UserID
表中删除Customer
外键,然后在数据库中创建两个主键之间的关系,以便Customer.CustomerID
是关联中的外键。
public class Customer
{
public int CustomerID { get; set; }
public virtual User User { get; set; }
//...
}
public class User
{
public int UserID { get; set; }
public virtual Customer Customer { get; set; }
//...
}
//...
this.HasRequired(t => t.User)
.WithOptional(t => t.Customer);
如果您无法更改数据库架构,最好的办法是仅从ICollection<Customer> Customers
类中删除集合User
,并将关系保持为一对多。
所有这一切的原因是EF仅支持共享主键一对一关联,而不支持外键一对一关联。 (后者你只能通过删除集合来“伪造”,但它仍然是EF观点中的一对多。)
您可以在此处详细了解与EF的一对一关联及其限制: