禁用属性上的CASCADE DELETE以避免不同的级联路径

时间:2014-06-08 08:02:48

标签: c# entity-framework ef-code-first fluent

我正在开发一个包含Entity Framework 6.1.0 Code First,.NET Framework 4.5,C#和SQL Server的库。

我有这两个类:

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }

    public ICollection<Group> Groups { get; set; }

    public ICollection<Message> MessagesSent { get; set; }
    public ICollection<Message> MessagesReceived { get; set; }
}

public class Message
{
    public int MessageId { get; set; }
    public string Body { get; set; }
    public DateTime DateSent { get; set; }

    public int UserId { get; set; }
    public User Sender { get; set; }

    public ICollection<User> Recipients { get; set; }
}

这些配置文件:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("User");

        Property(u => u.UserName).IsRequired();
        Property(u => u.UserName).HasMaxLength(50);

        HasMany(u => u.Groups).
            WithMany(g => g.Members).
                Map(ug =>
                {
                    ug.MapLeftKey("UserId");
                    ug.MapRightKey("GroupId");
                    ug.ToTable("UserGroup");
                });
    }
}

public class MessageConfiguration : EntityTypeConfiguration<Message>
{
    public MessageConfiguration()
    {
        ToTable("Message");

        Property(m => m.Body).IsRequired();
        Property(m => m.Body).IsMaxLength();

        Property(m => m.DateSent).IsRequired();

        HasRequired(m => m.Sender).
            WithMany(u => u.MessagesSent).
            HasForeignKey(m => m.UserId);

        HasMany(r => r.Recipients).
            WithMany(m => m.MessagesReceived).
            Map(mr =>
            {
                mr.ToTable("MessageRecipient");
                mr.MapLeftKey("MessageId");
                mr.MapRightKey("UserId");
            });
    }
}

我第一次运行此项目时收到以下消息:

Introducing FOREIGN KEY constraint 'FK_dbo.MessageRecipient_dbo.User_UserId' on table
'MessageRecipient' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION
or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

不会从我的数据库中删除用户,但我不知道如何解决此问题。

我认为问题是邮件有发件人(user)并且还有一个或多个收件人(user)。这会创建不同的级联路径(SQL Server不允许这样做)。

如何禁用这些级联路径?也许在Message.Sender

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题。

在我进入MessageConfiguration之前:

HasRequired(m => m.Sender).
    WithMany(u => u.MessagesSent).
    HasForeignKey(m => m.UserId);

现在我有:

HasRequired(m => m.Sender).
    WithMany(u => u.MessagesSent).
    HasForeignKey(m => m.UserId).
    WillCascadeOnDelete(false);

问题是SQL Server不允许多个级联路径。如果您删除某个用户,则Message上可以有两个删除级联:一个位于Message.Sender,另一个位于Message.Recipients