簡體   English   中英

實體框架(EF)代碼優先級聯刪除一對一或零關系

[英]Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

Julie LermanPluralsight“Entity Framework 5入門”課程的“Code First Modeling”部分之后,我創建了兩個POCO類,其中包含一對一或零關系:父(User)和可選孩子(UserDetail)。

User和UserDetail數據模型圖(點擊查看)。

請注意,圖中UserId屬性是UserDetail的主鍵和外鍵

相關代碼:

public class User
{
    //...

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    /* Has a 1:0..1 relationship with UserDetail */
    public virtual UserDetail UserDetail { get; set; }

    //...
}

public class UserDetail
{
    //...

    /* Has a 0..1:1 relationship with User */
    public virtual User User { get; set; }

    [Key, ForeignKey("User")]
    public int UserId { get; set; }

    //...
}

public class EFDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    //public DbSet<UserDetail> UserDetails { get; set; }  /* Explicit declaration not necessary. Context is aware of UserDetail entity due to 0..1:1 relationship with User */

    public EFDbContext()
    {
        Configuration.ProxyCreationEnabled = true;
        Configuration.LazyLoadingEnabled = true;
    }
}

public class UserRepository : IUserRepository
{
    private EFDbContext _context = new EFDbContext();

    public void Delete(User entity)
    {
        entity = _context.Users.Find(entity.UserId);

        //...

        _context.Users.Remove(entity);
        _context.SaveChanges();

        //...
    }
}

當調用UserRepository類中的Delete()方法時,它不會刪除數據庫中的用戶記錄,因為UserDetail中的外鍵沒有啟用級聯刪除。

DELETE語句與REFERENCE約束“FK_dbo.UserDetail_dbo.User_UserId”沖突。

如何使用Entity Framework Code First啟用一對一或零關系的級聯刪除(以便刪除用戶自動刪除UserDetail)?

您必須使用流暢的API來執行此操作。

嘗試將以下內容添加到DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{   
    modelBuilder.Entity<User>()
        .HasOptional(a => a.UserDetail)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
}

您還可以通過執行以下操作在應用程序的全局范圍內禁用級聯刪除約定:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()

這段代碼對我有用

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserDetail>()
            .HasRequired(d => d.User)
            .WithOptional(u => u.UserDetail)
            .WillCascadeOnDelete(true);
    }

遷移代碼是:

public override void Up()
    {
        AddForeignKey("UserDetail", "UserId", "User", "UserId", cascadeDelete: true);
    }

它工作得很好。 我第一次使用的時候

modelBuilder.Entity<User>()
    .HasOptional(a => a.UserDetail)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);

遷移代碼是:

AddForeignKey("User", "UserDetail_UserId", "UserDetail", "UserId", cascadeDelete: true); 

但它與可用的兩個重載中的任何一個都不匹配(在EntityFramework 6中)

暫無
暫無

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

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