簡體   English   中英

Entity Framework Core - 代碼優先 - 兩個外鍵 - 一張表

[英]Entity Framework Core - Code First - Two Foreign Keys - One Table

我正在使用 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; }
}

此外,如果我將其中一個屬性設為可空,它將編譯,但我擔心這會在以后引起問題。

顯然,您對同一row中的同一張表有 2 Fk s,所以想象一下,如果您刪除一個創建了分配的用戶並修改了一個應該發生的情況,刪除分配如果其他用戶修改它會怎樣,這將是繼承人表中的空值.

所以

您需要使用FluentApiCascadeOnDelete指定為false

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM