【发布时间】:2023-03-26 19:31:01
【问题描述】:
我正在尝试创建具有特定角色的新用户对象。 “角色”是 EF 中的现有实体。我用谷歌搜索,stackoverflow 直到我脸色发青,我已经尝试了所有似乎对其他人有用的东西。但是当我尝试保存我的新用户对象时,它首先会尝试创建一个新的“角色”,而不是仅仅创建一个引用现有角色的新用户对象。
我做错了什么?
Role myRole = new Role { ID = myUser.Role.ID };
myObjectContext.Roles.Attach(myRole);
myUser.Role = myRole;
if (myUser.ID == 0)
{
myObjectContext.Users.AddObject(myUser);
}
else
{
if (myUser.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Users.Attach(myUser);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myUser, System.Data.EntityState.Modified);
}
myObjectContext.SaveChanges(SaveOptions.None);
编辑 - 更多测试后...
好吧..所以无论如何我已经发现了“原因”的一部分。我仍然不知道它为什么会这样,需要帮助。
基本上,我将两组数据附加到我的新用户对象。一个是“角色”,它是包含角色的角色表的 FK。这显示为用户上的导航属性,例如“User.Role”。
第二组数据是称为“FIPS”的对象集合,它是用户与另一个称为 FIPS 的表之间的多对多关系。它们之间有一个关系表,它只包含两列,每列分别是 User 和 FIPS 的外键。用户的 FIPS 也是一个导航属性,被引用为“User.FIPS”。
这是显示在保存上下文之前将 FIPS 和角色分配给用户对象的完整代码。
List<string> fipsList = new List<string>();
foreach (FIPS fips in myUser.FIPS)
{
fipsList.Add(fips.FIPS_Code);
}
myUser.FIPS.Clear();
foreach (string fipsCode in fipsList)
{
FIPS myFIPS = new FIPS { FIPS_Code = fipsCode };
myObjectContext.FIPSCodes.Attach(myFIPS);
myUser.FIPS.Add(myFIPS);
}
Role myRole = new Role { ID = myUser.Role.ID };
myObjectContext.Roles.Attach(myRole);
myUser.Role = myRole;
if (myUser.ID == 0)
{
myObjectContext.Users.AddObject(myUser);
}
else
{
if (myUser.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Users.Attach(myUser);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myUser, System.Data.EntityState.Modified);
}
myObjectContext.SaveChanges(SaveOptions.None);
我设置了我的手表来检查“myObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)”的状态,看看什么时候添加了东西。
一旦第一个相关对象添加到用户对象,第二个尚未附加到上下文的相关对象就会添加到上下文中,其 EntityState 为“已添加”。
.... 看看是否有办法避免将相关实体附加到 User 实体,直到它们全部附加到上下文中。
--跟进-- 好的..我更改了代码的顺序,以便相关实体在分配给用户实体之前附加到上下文。但是一旦分配了第一个相关实体,第二个相关实体就会显示为“添加" 在 ObjectStateEntries 中。 所以,然后我将其更改为以下顺序:
- 将所有相关实体附加到上下文。
- 删除用户对象与相关实体的现有关系 类型。
- 将相关实体分配给用户实体。
- 保存用户实体。
而且.. 现在.. 它有效.. omg 它有效...! =)
【问题讨论】:
标签: c# entity-framework