遵循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)?
您将必须使用流畅的API来执行此操作。
尝试将以下内容添加到您的DbContext:
DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasOptional(a => a.UserDetail) .WithOptionalDependent() .WillCascadeOnDelete(true); }