实体框架代码优先:如何建立客户/地址关系模型?

时间:2011-03-01 18:59:07

标签: c# entity-framework code-first entity-framework-ctp5

这是我的简化模型:

public class Customer
{
    public int ID { get; set; }
    public int MailingAddressID { get; set; }
    [ForeignKey("MailingAddressID")]
    public Address MailingAddress { get; set; }

    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address
{
    public int ID { get; set; }
    public int CustomerID { get; set; }
    [ForeignKey("CustomerID")]
    public Customer Customer { get; set; }
}

当我尝试创建数据库时,我收到以下错误:

  

在表'Customers'上引入FOREIGN KEY约束'Customer_MailingAddress'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束。查看以前的错误。

我不明白问题是什么。我了解不能删除具有地址的客户,也不能删除作为客户邮寄地址的地址。

这符合我的设计,因为如果客户有一个或多个地址,那么一个地址必须是邮寄地址,并且该地址不能删除。

那我在这里错过了什么?谢谢!

修改

忘记提到我尝试在OnModelBuilding方法中添加以下行:

modelBuilder.Entity<Customer>().Property(x => x.MailingAddressID).IsOptional();

这允许构建数据库,但是在添加客户时,我收到以下错误:

  

INSERT语句与FOREIGN KEY约束“Customer_MailingAddress”冲突。冲突发生在数据库“DomainModel.SeasideHeightsEntities”,表“dbo.Addresses”,列'ID'中。   该语句已终止。

仍然不知道如何正确建模。

1 个答案:

答案 0 :(得分:3)

问题是......首先被删除,客户还是邮寄地址?您无法同时删除它们,删除将按顺序进行。当第一个被删除时,它会失败规则b / c,第二个尚未被删除。

从我所看到的模型中,我不会使用外键来处理这个逻辑,我会在对象验证期间通过在MailingAddress属性上放置[Required]属性而不是外键来处理它。 / p>

您还应该考虑其他实现逻辑,以确保MailingAddress是Addresses集合的一部分。