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

时间:2015-08-23 23:57:37

标签: c# sql-server entity-framework

审核后的答案和评论: 我的数据库结构是

 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用于帖子线程和用户中的所有插入条目。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

这一行正在加倍

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(); 

答案 1 :(得分:0)

实体框架会自动跟踪相关数据,因此当您添加新实体时,EF会跟踪其参考属性({{3}将其标记为Added }})。

当您添加相关实体时,它会自动被标记为已添加,因此如果您再次重新添加它,则会添加两次,因此根据您的代码,而不是单独添加每个实体(I把它oEntity作为你的上下文),只需添加中心对象,然后设置它的引用属性(即base.User等。)。

答案 2 :(得分:0)

感谢大家的帮助。 实际上甚至初始代码也没问题。 原因是USERS表上的AfterInsert触发器正在向BASE_ID添加条目。 所以我将你的评论标记为答案并关闭主题。 再次感谢。