ars*_*ogy 52 c# entity-framework cascading-deletes ef-code-first entity-framework-5
在Julie Lerman的Pluralsight"Entity Framework 5入门"课程的"Code First Modeling"部分之后,我创建了两个POCO类,其中包含一对一或零关系:父(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();
//...
}
}
Run Code Online (Sandbox Code Playgroud)
当调用UserRepository类中的Delete()方法时,它不会删除数据库中的用户记录,因为UserDetail中的外键没有启用级联删除.
DELETE语句与REFERENCE约束"FK_dbo.UserDetail_dbo.User_UserId"冲突.
如何使用Entity Framework Code First 启用一对一或零关系的级联删除(以便删除用户自动删除UserDetail)?
hut*_*oid 72
您必须使用流畅的API来执行此操作.
尝试将以下内容添加到您的DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOptional(a => a.UserDetail)
.WithOptionalDependent()
.WillCascadeOnDelete(true);
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过执行以下操作在应用程序的全局范围内禁用级联删除约定:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
97491 次 |
最近记录: |