我正在使用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; }
}
此外,如果我将其中一个属性设置为可空值,它将进行编译,但我担心稍后会导致问题。
答案 0 :(得分:0)
显然,您在同一Fk
中的同一表中有2个row
,因此,如果您删除创建了分配的用户并修改了一个应发生的情况,则删除该分配,如果其他用户对其进行了修改,在继承人表中将为空。
如此
您需要使用CascadeOnDelete
指定false
至FluentApi
在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-migration
和update-database