Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架4.3与5.0的更新差异_.net_Entity Framework_Entity Framework 4_Entity Framework 5 - Fatal编程技术网

.net 实体框架4.3与5.0的更新差异

.net 实体框架4.3与5.0的更新差异,.net,entity-framework,entity-framework-4,entity-framework-5,.net,Entity Framework,Entity Framework 4,Entity Framework 5,我已经为我的ASP.NET MVC应用程序工作了几个月了。当我第一次开始研究它时,我使用的是EntityFramework4.3(代码优先,带迁移)。当我这样做的时候,我在尝试更新MainClient表时遇到了一些问题。MainClient包含客户端的所有基本信息,并且与BPClient表有1:1的关系,BPClient表包含有关该客户端的更多具体信息,这些信息与BP模块的许可协议有关。两者都可以在选项卡控件的同一页上编辑。但是,在尝试将MainClient对象的EntityState更改为En

我已经为我的ASP.NET MVC应用程序工作了几个月了。当我第一次开始研究它时,我使用的是EntityFramework4.3(代码优先,带迁移)。当我这样做的时候,我在尝试更新MainClient表时遇到了一些问题。MainClient包含客户端的所有基本信息,并且与BPClient表有1:1的关系,BPClient表包含有关该客户端的更多具体信息,这些信息与BP模块的许可协议有关。两者都可以在选项卡控件的同一页上编辑。但是,在尝试将MainClient对象的EntityState更改为EntityState时,我不断遇到以下异常。已修改:

System.InvalidOperationException : An object with the same key already exists 
in the ObjectStateManager. The ObjectStateManager cannot track multiple objects 
with the same key.
我在调试时注意到,当对象进入我的控制器类进行保存时,它本身被认为是分离的。作为此问题的解决方法,我对和中发现的问题应用了类似的解决方案。考虑到在名为
client
的MainClient对象中传递的Edit方法,下面是用于重新附加对象的代码之后的外观(我知道很凌乱):

var newClientObject = new MainClient { ClientID = client.ClientID };
Db.MainClients.Attach(newClientObject);
Db.Entry(newClientObject).CurrentValues.SetValues(client);

var bpClient = new BPClient { ClientID = client.ClientID, BaseClient = newClientObject };
if (client.BPClient != null)
{
    Db.BostonpostClients.Attach(bpClient);
    Db.Entry(bpClient).CurrentValues.SetValues(client.BPClient);
}

Db.SaveChanges()
这在所有测试用例中都非常有效。直到最近

最近,我将我的应用程序升级为使用EntityFramework5(仍然首先使用代码)。但是,当我再次测试MainClient编辑页面时,我发现了一些相当不稳定的行为。某些字段在编辑后将被保存而不会出现问题。其他人永远不会向DB承诺。还有一些可以很好地保存,但前提是它们是正在编辑的对象的唯一部分。我调试了Controller类中的DbContext,发现很麻烦的是,不仅页面上所做的更改被发送到Controller类,ObjectStateManager中还包含MainClient和BPClient对象以及页面上所做的更改!顺便说一句,我应该在这里提到,我在调试时没有收到一个错误,即使在SaveChanges()之后也没有

我决定尝试将代码还原到原来的状态,也就是说,还原的逻辑方式是:

Db.Entry<BPClient>(client.BPClient).State = EntityState.Modified;
Db.Entry<MainClient>(client).State = EntityState.Modified;

Db.SaveChanges();
Db.Entry(client.BPClient.State=EntityState.Modified;
Db.Entry(client.State=EntityState.Modified;
Db.SaveChanges();
现在它完全可以正常工作了。无无效操作例外。所以问题解决得很好

仍然困扰我的是,我试图弄清楚5.0中发生了什么变化,使我先前的修复程序停止工作,并在我身上出现了问题。为什么该代码在4.3中运行良好,但在5.0中却无法运行?在5.0中,是什么让使用该代码提交到数据库变得如此不稳定


有人知道为什么会发生这种情况吗?

我自己也有这个问题。我使用IDbSet类来填充数据库表,当我使一个属性virtual EF5执行延迟加载(我的虚拟属性在数据库中的其他对象所在的位置)时,我发现了这一点。这意味着我收到虚拟财产的新主键。如果我没有一个特定的id和我想要引用的对象关联,EF5会尝试建立一个双向关系。如果您没有明确告诉EF要在DBContext中映射到哪个属性,它将为同一对象设置两个外键,这是不允许的。希望这能有所帮助。

感谢您尝试回答我的问题。不过,我认为这里的情况并非如此。我已经将MainClient和BPClient之间的1:1设置为双向关系(都具有虚拟属性和id)。我只是想弄明白为什么代码突然停止工作。只使用virutal属性会导致延迟加载,在dbcontext中属性之间是否有相同的映射?我使用的是数据注释,而不是FLuent API。映射完全在对象本身上,而不是在DbContext中。是否在4.3和5.0之间发生了延迟加载的情况,会以这种方式影响代码?在我刚刚完成的一个应用程序中,我们将从4.3更改为5.0,如上所述,如果您尝试延迟加载和映射,则会得到两个键。我们修复它的方法是直接在dbcontext中映射一个int-fooId和一个int-barId属性,我们没有进行任何延迟加载,因为EF尝试进行倍数运算,在某些情况下它无法选择其中一个。这可能会对您有所帮助。实体框架5枚举和从EF 4.3移动解决方案