这是我的简化模型:
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'中。 该语句已终止。
仍然不知道如何正确建模。
答案 0 :(得分:3)
问题是......首先被删除,客户还是邮寄地址?您无法同时删除它们,删除将按顺序进行。当第一个被删除时,它会失败规则b / c,第二个尚未被删除。
从我所看到的模型中,我不会使用外键来处理这个逻辑,我会在对象验证期间通过在MailingAddress属性上放置[Required]属性而不是外键来处理它。 / p>
您还应该考虑其他实现逻辑,以确保MailingAddress是Addresses集合的一部分。