实体框架核心-代码优先-两个外键-一个表

时间:2020-01-24 20:13:30

标签: c# entity-framework .net-core entity-framework-core

我正在使用EF Core。我希望我的基类保留对CreateByUser和LastModifiedByUser的引用。不幸的是,我只能使它与一个外键一起使用。当我尝试添加第二个外键时,出现此错误:

在表“ Assignments”上引入FOREIGN KEY约束“ FK_Assignments_Users_LastModifiedByUserId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束或索引。请参阅先前的错误。请注意,我可以使用“添加迁移”而不会出现任何错误,但是一旦运行“更新数据库”,它就会出错。

下面是与问题和错误相关的代码。

public abstract class DivBase
{
    [Key]
    public int Id { get; set; }

    [Required]
    public DateTimeOffset DateCreated { get; set; }

    public int CreatedByUserId { get; set; }

    [Required]
    public DateTimeOffset LastDateModified { get; set; }

    public int LastModifiedByUserId { get; set; }

    [ForeignKey("CreatedByUserId")]
    public DivUser CreatedByUser { get; set; }

    [ForeignKey("LastModifiedByUserId")]
    public DivUser LastModifiedByUser { get; set; }
}

public class DivUser
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(256)]
    public string Name { get; set; }

    [Required]
    [MaxLength(256)]
    public string Email { get; set; }
}

public class DivAssignment : DivBase, IDivEvent
{
    public DateTimeOffset StartDate { get; set; }
    public DateTimeOffset EndDate { get; set; }      
}

public interface IDivEvent
{
    [Required]
    public DateTimeOffset StartDate { get; set; }

    [Required]
    public DateTimeOffset EndDate { get; set; }
}

此外,如果我将其中一个属性设置为可空值,它将进行编译,但我担心稍后会导致问题。

1 个答案:

答案 0 :(得分:0)

显然,您在同一Fk中的同一表中有2个row,因此,如果您删除创建了分配的用户并修改了一个应发生的情况,则删除该分配,如果其他用户对其进行了修改,在继承人表中将为空。

如此

您需要使用CascadeOnDelete指定falseFluentApi

ApplicationContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DivAssignment>()
                .HasRequired(c => c.CreatedByUser)
                .WithMany(u => u.CreatedDivAssignments)
                .HasForeignKey(c => c.CreatedByUserId)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<DivAssignment>()
                .HasRequired(c => c.LastModifiedByUser)
                .WithMany(u => u.ModifiedDivAssignments)
                .HasForeignKey(c => c.LastModifiedByUserId)
                .WillCascadeOnDelete(false);
        }

然后依次add-migrationupdate-database