【问题标题】:Entity Framework - deleting N:N relation实体框架 - 删除 N:N 关系
【发布时间】:2013-01-17 19:05:10
【问题描述】:

我有以下课程

public class ObjectA{
   private List<ObjectB> list;    
}

ObjectAObjectB 是 N:N 关系。

我只想删除关系并使用

 while (objectA.list.Any())
        objectA.list.Remove(objectA.list.First());
  • 列表是关系表 -

    List<ObjectAobjectB>
    

我明白了

操作失败:无法更改关系,因为一个或多个 外键属性不可为空。当关系发生变化时, 相关的外键属性设置为空值。如果外键没有 支持空值,必须定义新的关系,外键属性 必须分配另一个非空值,否则必须删除不相关的对象。

编辑:更新模型定义
我的模型中有三个表:
* ClassA - SchemaA,
* ClassAClassB - SchemaA,
* ClassB - SchemaB,

在我的上下文(和 edmx)中,我只有模式 A(ClassA 和 ClassAClassB)
对于关系表,它是 1:N。

这是从 edmx 生成的代码。

public partial class ClassA:DomainEntity
{
    ....
    public virtual ICollection<ClassB>  ClassAClassB { get; set; }
}

我做错了什么?

谢谢。

【问题讨论】:

  • 您的映射似乎有问题,因为 EF 认为关系是 1:N。你的 ObjectB 是如何定义的?
  • @LadislavMrnka :edmx 中根本没有 ClassB。添加了定义。谢谢,
  • 如果架构中有 ClassAClassB,则没有映射 M:N 关系。相反,您有两个 1:N 关系,并且您的 ClassA 和 ClassB 必须具有指向 ClassAClassB 的导航属性。为什么要映射 ClassAClassB?它是否包含除 FK 之外的任何其他内容?
  • @LadislavMrnka:感谢您的评论。基本上数据库中的每个 M:N 关系都由两个 1:N 关系和之间的关系表组成。我没有 ClassB 因为我不需要它(而且它在另一个模式中)。我只需要删除关系。我确实有从 ClassA 到 ClassAClassB 的导航属性 (1:N)。

标签: entity-framework entity-framework-4


【解决方案1】:

如果您与不可为空的 FK 有一对多关系,您还必须删除 ObjectB,因为从导航属性中删除它只会删除关系(使 FK 为空)但不会删除 ObjectB 本身。试试这个:

 while (objectA.list.Any()) {
     var b = b;
     objectA.list.Remove(b);
     entities.DeleteObject(b);    
 }

【讨论】:

  • 谢谢。但我只想删除关系
  • 在这种情况下,ClassAClassB 必须具有可为空的 FK。
  • 为什么?我正在删除关系表中的整行。不仅是键列
  • 是的,如果您要删除映射表 (ClassAClassB) 中的行,则必须将其删除。仅当联结表未映射为实体时,EF 才会自动处理删除。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多