相关疑难解决方法(0)

实体框架创建与现有实体关系的新实体,导致尝试创建现有实体的新副本

我正在尝试创建具有特定角色的新用户对象."角色"是EF中的现有实体.我用谷歌搜索了,并且堆栈溢出,直到我脸色发青,我已经尝试了所有似乎对其他人都有用的东西.但是当我尝试保存我的新用户对象时,它首先尝试创建一个新的"角色",而不是仅仅创建一个引用现有角色的新用户对象.

我究竟做错了什么?

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);
Run Code Online (Sandbox Code Playgroud)

编辑 - 更多测试后......

好吧..所以我无论如何都发现了"原因"的某些部分.我仍然不知道为什么会这样做并需要帮助.

基本上,我附加到我的新User对象有两组数据.一个是"角色",它是包含角色的角色表的FK.这在用户上显示为"User.Role"的导航属性.

第二组数据是名为"FIPS"的对象集合,它们是用户与另一个名为FIPS的表之间的多对多关系.它们之间有一个关系表,它只包含两列,每列分别是User和FIPS的外键.用户的FIPS也是一个导航属性,引用类似"User.FIPS".

以下是整个代码,显示在保存上下文之前将FIPS和角色分配给User对象.

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 …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework

21
推荐指数
1
解决办法
2万
查看次数

如何深度复制实体

我在这里找到了这个片段:

public static T DeepClone<T>(this T obj)
    {
        using (var ms = new MemoryStream()) {
            var bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            ms.Position = 0;
            return (T)bf.Deserialize(ms);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这说明我们可以通过这个东西对所有相关对象进行深层复制.

我正在尝试这样的副本:

db.Detach(myEntity); 
myEntity.EntityKEy = null;
Entity newEntity = new Entity();
newEntity = DeepClone<Entity>(Entity);
db.Entities.AddObject(newEntity);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

它可以工作,但仍然不会复制任何嵌套的\相关记录.我在这做错了什么?

我有这个结构Entity-> ChildEntity - > ChildChildEntity
- > - one-to-many
所以我假设当我复制实体时它也会复制所有子记录.

更新: 建议之后,我这样做了:

Entity newEntity = new Entity();
Eneity Entity = db.Include("ChildEntity").Where(p=>p.Id==Id).Single();
newEntity = DeepClone<Entity>(Entity);
db.Detach(myEntity); 
myEntity.EntityKEy = null;
db.Entities.AddObject(newEntity);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

在AddObject行上获取异常:

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.

c# entity-framework .net-4.0

11
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×2

entity-framework ×2

.net-4.0 ×1