实体框架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线程和用户中所有插入的条目。

实体框架6.0插入两行而不是一行

这一行是双引号

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。所以我把你的评论标记为回答并关闭线程。再次感谢。