实体结构:
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实体)的删除操作?
谢谢。
试试:delete from EntityAB where EntityA.Id = 1 and EntityB.Id = 3
恩。这个也是一个办法,比我目前逐条检索后删除是要好点。
不能直接通过remove后使用update达成目的吗?
@519740105:
public class EntityB
{
public int Id { get; set;}
public virtual ICollection<EntityAB> EntityABs { get; set; }
}
@Launcher: 在EntityB里也增加集合后,就能解决这个问题?那是同时也要在EntityB里也进行Remove吧?
@519740105: 那只是正确的实体映射代码。然后你把你删除的代码贴出来,我看看。
@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: 没有对EntityABs进行Remove,是否会出现意外?
@519740105: 我不知道你这句话“ 没有对EntityABs进行Remove,是否会出现意外?” 是否还包含了“从 EntityA 的 EntityABs 集合中移除项”的操作,所以我要申明下,正确的移除方式请看我给的代码,移除 EntityAB 只能针对 DbContext.DbSet<EntityAB> 来操作。因为你不愿意提供你的代码,所以我给你贴了段代码,请你仔细看看。
@Launcher: 我的代码很简单,就是找到要删除的EntityAB实体,然后再对EntityABs集合使用Remove功能。不是不愿意提供,而是代码牵涉到很多,反而影响你的理解。
我的意思是,当我们直接对DbSet<EntityAB>使用Remove操作后,系统是否会自动更新EntityABs这个集合?如果有自动更新,自然没问题,如果没有自动更新,是否还需要对EntityABs集合再执行一次Remove操作。
@519740105: 直接对DbSet<EntityAB>使用Remove操作后,系统会自动更新 EntityA.EntityABs 集合。其实你把我写的那段代码运行下就知道结果了。反正我说话你不信,但是代码不会骗人。
@Launcher: 不是信不信的问题,是确认下是否会自动更新EntityA.EntityABs的问题而已。