【问题标题】:Entity Framework Core - Code First - Two Foreign Keys - One Table实体框架核心 - 代码优先 - 两个外键 - 一个表
【发布时间】:2020-01-24 20:13:30
【问题描述】:

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

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

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

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; }
}

另外,如果我将其中一个属性设为可空,它将编译,但我担心这会在以后引起问题。

【问题讨论】:

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


    【解决方案1】:

    显然你有一个 2 Fks 到同一个表中的同一个 row 所以想象如果你删除一个创建了分配的用户并修改了一个应该发生的情况,删除分配如果其他用户修改它怎么办这将是继承人表中的空值。

    所以

    您需要使用FluentApi 指定CascadeOnDeletefalse

    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

    【讨论】:

    • 当然我推荐使用FluentAPI ,因为它比DataAnnotations丰富得多
    • Ahmed,这是 Entity Framework Core 的语法吗?因为我的 Visual Studio 无法识别 hasRequired、withMany 或其他
    • 嗨@TomCrosman 首先我尝试了这个并且它有效,实际上我为你制作了整个项目。第二是它在visualStudio 但你需要在你的DBContext 中添加它项目
    • 我试图将它添加到我的 DBContext。我认为问题在于这些语法是EntityFramework的错误版本(我使用的是Entity Framework Core)
    • 艾哈迈德,感谢您的所有努力。我选择了你的答案,但我再次指出你没有使用 Microsoft.EntityFrameworkCore 而是使用 System.Data.Entity。
    猜你喜欢
    • 2019-07-22
    • 2011-07-30
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多