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

遵循Julie Lerman编写的Pluralsight“ Entity Framework

5入门”课程的“代码优先建模”部分之后,我创建了两个具有

关系的POCO类:一个父项(用户)和一个 子(UserDetail)。

用户和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)?

回答:

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Entity<User>()

.HasOptional(a => a.UserDetail)

.WithOptionalDependent()

.WillCascadeOnDelete(true);

}

以上是 一对一或一对一关系的实体框架(EF)代码优先级联删除 的全部内容, 来源链接: utcz.com/qa/414514.html

回到顶部