审核后的答案和评论: 我的数据库结构是
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用于帖子线程和用户中的所有插入条目。 提前谢谢。
答案 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添加条目。 所以我将你的评论标记为答案并关闭主题。 再次感谢。