我想使用Entity Framework Code First Fluent API来映射一个已有的数据库。我在处理多对多关系和级联删除时遇到了一些困难。
这是我的两个POCO类:
public class Foo
{
public int FooId;
public string FooDescription;
public IList<Bar> Bars;
}
public class Bar
{
public int BarId;
public string BarDescription;
}
目前,我只有从Foo
到Bar
的导航属性。这是因为在我的实际场景中,从Bar
到Foo
没有任何意义。从Foo
到Bar
的关系实际上是0,n,这意味着一个Foo
实例不需要Bar
实例。
我的现有数据库在这两个表之间有一个联接表。这个表看起来像这样:
create table Foo_Bar(
FooId int not null,
BarId int not null
);
因为我不想在我的项目中创建这样的Poco类,所以我将表映射如下:
modelBuilder.Entity<Foo>()
.HasMany(t => t.Bars)
.WithMany()
.Map(m =>
{
m.ToTable("Foo_Bar");
m.MapLeftKey("FooId");
m.MapRightKey("BarId");
});
这对插入操作非常完美。在Foo上进行实体插入,然后在现有的Foo_Bar
表上进行插入。
但是当我删除一个Foo
时,我想删除连接表上的记录,但不删除子表中的记录。也就是说,我想删除Foo_Bar
上的记录,但不扩展到Bar
。
这样的映射是否可能?我应该提到,在我的上下文中,我删除了OneToManyCascadeDeleteConvention
和ManyToManyCascadeDeleteConvention
,因为99%的时间我不会使用级联删除。这是一个特定的情况。
通过跟踪Entity Framework生成的SQL,我还注意到,如果我检索一个Foo
实例,并将其内部的所有Bars设置为EntityState.Deleted,EF将删除Foo_Bar
和Bar
中的两个记录。我还应该提到的最后一件事是,我正在使用断开连接的场景。
我试图搜索这个问题,但似乎我没有使用正确的关键词,因为我找不到任何处于这种情况的人。此时,我唯一看到的解决方案是映射一个FooBar
类,但我希望有一种方法可以做到这一点。
--编辑
起初,我的删除方法是错误的。当我尝试删除时,我没有传递Foo
实例及其填充的Bar
列表。更改后,Entity Framwork为列表中的每个Bar
创建一个删除语句。我仍然在更新方面遇到问题,例如同时添加和删除项目。将进行更多测试并在此处发布。
提前感谢您的帮助。