2013-01-17 35 views
1

我有下面的类实体框架 - 删除N:N关系

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; } 
} 

我在做什么错?

谢谢。

+0

看起来你的映射有些问题,因为EF认为关系是1:N。你的ObjectB是如何定义的? –

+0

@LadislavMrnka:edmx中根本没有ClassB。新增定义。谢谢, – Jeb

+0

如果您在架构中有ClassAClassB,则您没有映射M:N关系。您改为具有两个1:N关系,并且您的ClassA和ClassB必须具有指向ClassAClassB的导航属性。为什么你有ClassAClassB映射?它是否包含除FK之外的其他内容? –

回答

1

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

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

谢谢。但是我想只删除关系 – Jeb

+0

在这种情况下,ClassAClassB必须有可空的FK。 –

+0

为什么? 我正在删除关系表中的整个行。不仅关键列 – Jeb