一对一或一对一关系的实体框架(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