c# - EntityFrameworkCore模型之间的关系和级联删除
问题描述
我有这些课程:
public class A
{
public A()
{
nameA = string.Empty;
ListB = new List<B>();
}
public string nameA { get; set; }
public List<B> ListB { get; set; }
}
public class B
{
public C cObject { get; set; }
public string nameB { get; set; }
}
public class C
{
public string nameC { get; set; }
}
我正在使用Microsoft.EntityFrameworkCore
这些模型的数据库,我能够生成数据库和正确的表,但我缺少两件事:
- (A 和 B) 和 (B 和 C) 之间的关系。
- 以及级联添加和删除对象的能力(例如,在我的情况下,当删除对象 A 时,删除相应的 B 对象列表)。
这是我的上下文文件中的代码:
public class Context : DbContext
{
#region Tables
public DbSet<A> As{ get; set; }
public DbSet<B> Bs { get; set; }
public DbSet<C> Cs { get; set; }
#endregion
public Context(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//primary key's
modelBuilder.Entity<A>().HasKey(x => x.nameA);
modelBuilder.Entity<B>().HasKey(x => x.nameB);
modelBuilder.Entity<C>().HasKey(x => x.nameC);
//foreign key's
modelBuilder.Entity<A>().HasMany<B>(app => app.ListB);
modelBuilder.Entity<B>().HasOne<C>(app => app.cObject);
base.OnModelCreating(modelBuilder);
}
}
解决方案
您可以根据您的要求使用以下代码。您必须使用A
表的 PK 作为外键 inB
和C
表 PK 作为外键 on B
。如果你想要,DeleteBehavior.Cascade
那么你必须使用Required
. 或者你可以使用Fluent API来做到这一点。
public class A
{
public A()
{
nameA = string.Empty;
ListB = new List<B>();
}
public string nameA { get; set; }
public List<B> B{ get; set; }
}
public class B
{
public int CForeignKey { get; set; }
[ForeignKey("CForeignKey")]
public C C { get; set; }
public string nameB { get; set; }
[Required]
public int AForeignKey { get; set; }
[ForeignKey("AForeignKey")]
public A A {get; set;}
}
public class C
{
public string nameC { get; set; }
}
流畅的 API:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<B>()
.HasOne(p => p.A)
.WithMany(b => b.B)
.OnDelete(DeleteBehavior.Cascade);
}
推荐阅读
- mysql - 在 Worpress 中读取 MYSQL Gravity Forms 中的字段
- php - 尝试在 Azure 的 VM ubuntu 中使用 SendGrid 发送电子邮件时出错
- apache - 如何将 .htaccess 重写 URL 转换为 web.config 格式
- r - R:传递要执行的赋值语句列表和存储的赋值变量
- upgrade - Artifactory 升级失败,需要 postgres 9.5 -> 9.6 升级说明
- android - 如果我希望每次看到活动时都执行网络请求,应该使用哪种生命周期方法?
- javascript - Async/Await 和 Redux Thunks:调用 'dispatch' 是否隐式返回来自 thunk 的承诺?
- javascript - 创建一个简单的分数排行榜
- python - 同步代码的异步性能
- laravel - 升级存储中的 Wamp 图像后未显示 404 未找到