首页 新闻 会员 周边

非简单多对多关系数据的删除问题

0
悬赏园豆:10 [已解决问题] 解决于 2014-07-24 11:54

实体结构: 

 1 public class EntityA
 2 {
 3     public int Id { get; set; }
 4     public virtual ICollection<EntityAB> EntityABs { get; set; }
 5 }
 6 
 7 public class EntityB
 8 {
 9     public int Id { get; set;}
10 }
11 
12 public class EntityAB
13 {
14     public int Id { get; set; } 
15     public int EntityAid { get; set; }
16     public virutal EntityA EntityA { get; set; }
17     public int EntityBid { get; set; }
18     public virtual EntityB EntityB { get; set; }
19 }

EntityAB是EntityA和EntityB的多对多关联表。

我现在的问题是:

使用EntityA的集合EntityABs删除元素后,不能更新,系统会报告EntityAB的字段EntityAid不可以设置为空,导致不能执行删除操作。

目前是通过把要删除的数据记录下来,逐个删除后再更新EntityA实体来达到目的,为了保证数据的一致性,其中使用了事务。

 

请问:是否有办法能一次性的对EntityABs执行Remove后更新就同步执行对要删除元素(EntityAB实体)的删除操作?

 

谢谢。

< >
分享
最佳答案
0

试试:delete from EntityAB where EntityA.Id = 1 and EntityB.Id = 3

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2014-07-23 09:31

恩。这个也是一个办法,比我目前逐条检索后删除是要好点。

不能直接通过remove后使用update达成目的吗?

519740105 | 园豆:5810 (大侠五级) | 2014-07-23 10:37

@519740105: 

public class EntityB

{

    public int Id { get; set;}

    public virtual ICollection<EntityAB> EntityABs { get; set; }

}

Launcher | 园豆:45045 (高人七级) | 2014-07-23 10:41

@Launcher: 在EntityB里也增加集合后,就能解决这个问题?那是同时也要在EntityB里也进行Remove吧?

519740105 | 园豆:5810 (大侠五级) | 2014-07-23 10:42

@519740105: 那只是正确的实体映射代码。然后你把你删除的代码贴出来,我看看。

Launcher | 园豆:45045 (高人七级) | 2014-07-23 11:35

@519740105: 我猜测你应该是这样移除的:

EntityA.EntityABs.Remove(obj);

这是错误的,这相当于 SQL 语句: delete from EntityA where id = xxx;

正确的删除 SQL 语句是: delete from EntityAB where Id = 1;

相当于 EF 中的:

var a = DbContext.DbSet<EntityA>.First();

var b = a.EntityABs.First();

DbContext.DbSet<EntityAB>.Remove(b);

DbConext.SaveChanges();

 

Launcher | 园豆:45045 (高人七级) | 2014-07-23 14:06

@Launcher: 没有对EntityABs进行Remove,是否会出现意外?

519740105 | 园豆:5810 (大侠五级) | 2014-07-23 14:23

@519740105: 我不知道你这句话“ 没有对EntityABs进行Remove,是否会出现意外?” 是否还包含了“从 EntityA 的 EntityABs 集合中移除项”的操作,所以我要申明下,正确的移除方式请看我给的代码,移除 EntityAB 只能针对 DbContext.DbSet<EntityAB> 来操作。因为你不愿意提供你的代码,所以我给你贴了段代码,请你仔细看看

Launcher | 园豆:45045 (高人七级) | 2014-07-23 14:31

@Launcher: 我的代码很简单,就是找到要删除的EntityAB实体,然后再对EntityABs集合使用Remove功能。不是不愿意提供,而是代码牵涉到很多,反而影响你的理解。

 

我的意思是,当我们直接对DbSet<EntityAB>使用Remove操作后,系统是否会自动更新EntityABs这个集合?如果有自动更新,自然没问题,如果没有自动更新,是否还需要对EntityABs集合再执行一次Remove操作。

519740105 | 园豆:5810 (大侠五级) | 2014-07-24 09:59

@519740105: 直接对DbSet<EntityAB>使用Remove操作后,系统会自动更新 EntityA.EntityABs 集合。其实你把我写的那段代码运行下就知道结果了。反正我说话你不信,但是代码不会骗人。

Launcher | 园豆:45045 (高人七级) | 2014-07-24 10:04

@Launcher: 不是信不信的问题,是确认下是否会自动更新EntityA.EntityABs的问题而已。

519740105 | 园豆:5810 (大侠五级) | 2014-07-24 11:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册