实体框架6.0插入两行而不是一行
本文关键字:一行 两行 框架 插入 实体 | 更新日期: 2023-09-27 18:09:31
在审阅答案和评论后:我的DB结构是
1) TABLE BASE_ID ( ID int PK (IDENTITY(1,1))
2) TABLE USERS (ID int PK, FK(BASE_ID.ID).. rest of fields)
3) TABLE THREADS (ID int PK,(IDENTITY(1,1), UserID FK (BASE_ID.ID) )
4) TABLE_POSTS (ID int PK,(IDENTITY(1,1), UserID FK(BASE_ID.ID), ThreadID FK(THREAD.ID) )
我需要在一个事务中使用EF(6.0)在这些表中插入新的值我坚持EF在BASE_ID创建两个记录,即使我这样做:
//Create new base entry
BASE_ID base = new BASE_ID();
//Create new User
USERS user = new USERS();
//Init fields
THREADS thread = new THREADS();
POSTS post = new POSTS();
post.Thread =thread;// linked property not (int ThreadID since don't yet know it
base.User = user; //linker property
base.Posts.Add(post); //also linked property
//base.Threads.Add(thread);//this was removed. But problem not solved.
oEntity.BASE_ID.Add(base);
oEntity.SaveChanges(); // And here i have already two new BASE_ID's
更新:提交后的DB变为:
Posts.UserID=n //Lets say 1
Threads.UserId=n,//same as above
Users.ID = n+1; // incremented so 2
我试着添加各种组合,比如
user.BASE_ID = base;
oEntity.USERS.Add(user);
oEntity.THREADS.Add(thread);
oEntity.POSTS.Add(post);
oEntity.SaveChanges(); // same result as above.
我真的卡住了。问题:如何强制(或解释)EF,我只需要一个BASE_ID用于post线程和用户中所有插入的条目。
这一行是双引号
base.Threads.Add(thread);
您之前已经添加了:
post.Thread =thread;
所以就是:
//Create new base entry
BASE_ID base = new BASE_ID();
POSTS post = new POSTS() {Thread = new THREADS()};
base.Posts.Add(post);
base.User = new USERS();
oEntity.BASE_ID.Add(base);
oEntity.SaveChanges();
实体框架自动跟踪相关数据,所以当你添加一个新实体时,它的引用属性被EF跟踪(它被ObjectStateManager
标记为Added
)。
当你添加一个相关的实体时,它会自动被标记为添加,所以如果你再次添加它,它会被添加两次,所以根据你的代码,而不是单独添加每个实体(我认为oEntity
是你的上下文),只是添加中心对象,然后设置其引用属性(即base.User
等)。
谢谢大家的帮助。实际上,甚至最初的代码都没问题。原因是在USERS表上向BASE_ID添加表项时触发了AfterInsert。所以我把你的评论标记为回答并关闭线程。再次感谢。