对属性禁用级联删除以避免不同的级联路径

本文关键字:级联 路径 属性 删除 | 更新日期: 2023-09-27 18:07:49

我正在使用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上。

对属性禁用级联删除以避免不同的级联路径

我已经解决了我的问题。

在我上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上。