如何在实体框架代码优先迁移中关闭多个1到1表关系的级联删除到同一个表

时间:2013-08-06 13:32:46

标签: entity-framework ef-migrations

我有以下表结构简化

public class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }

}

public class Buyer
{
    public int BuyerId { get; set; }
    public int UserId { get; set; }
    public UserProfile User { get; set; }
    public ICollection<Order> Order { get; set; }
}

public class Seller
{
    public int SellerId { get; set; }
    public int UserId { get; set; }
    public UserProfile User { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public int BuyerId { get; set; }
    public int SellerId { get; set; }
    public string Address { get; set; }
    public <OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    public int OrderId { get; set; }
    public int OrderLineNo { get; set; }
    public int StockId { get; set; }
    public int Quantity { get; set; }
}

当我运行Update_Database命令时,我收到以下错误

  

在表'买家'上引入FOREIGN KEY约束'FK_dbo.Buyers_dbo.UserProfile_UserId'可能会导致循环或多个级联路径。   DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我的买家和卖家表与UserId上的UserProfile有一对一的关系,所以我理解当你删除买家时,它不能删除UserProfile,因为可能有卖家,反之亦然。

因此,我想使用流畅的语法关闭买方对用户和卖方给用户的级联删除,但是我无法获得某些工作,所以如果有人可以提供帮助,我们将不胜感激。

我已经查看了其他StackOVerflow问题以查找相同的错误,但找不到与我的方案匹配的问题。

额外:如果我将Buyer表中的UserId重命名为DummyUserId,则Uppdate-Database命令可以正常工作,但这并不好。

1 个答案:

答案 0 :(得分:1)

通常您可以使用.WillCascadeOnDelete(false);

禁用级联删除

因此,对于您的映射,可能具有类似于以下内容的内容:

        modelBuilder.Entity<Buyer>()
            .HasRequired(x => x.User)
            .WithMany()
            .HasForeignKey(x => x.UserId)
            .WillCascadeOnDelete(false);