一尘不染

一对一或一对一关系的实体框架(EF)代码优先级联删除

c#

遵循Julie Lerman编写的Pluralsight“ Entity Framework
5入门”课程
的“代码优先建模”部分之后,我创建了两个具有 一对零或一个
关系的POCO类:一个父项(用户)和一个 可选项 子(UserDetail)。

用户和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()方法时,它不会删除数据库中的User记录,因为UserDetail中的外键没有启用级联删除。

DELETE语句与REFERENCE约束“ FK_dbo.UserDetail_dbo.User_UserId”冲突。

您将如何使用“实体框架代码优先” 启用 一对一或零关系的 级联删除(以便删除用户会自动删除UserDetail)?


阅读 471

收藏
2020-05-19

共1个答案

一尘不染

您将必须使用流畅的API来执行此操作。

尝试将以下内容添加到您的DbContext

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