事务复制活动时实体框架模型的问题

Posted

技术标签:

【中文标题】事务复制活动时实体框架模型的问题【英文标题】:Problems with Entity Framework Model when Transactional Replication active 【发布时间】:2011-08-08 04:47:19 【问题描述】:

我有一种情况,我使用 SQL Server 事务复制从我的主数据库到我的故障转移数据库。我有一个主站点,而我的故障转移网站正在使用我的故障转移数据库。

两个网站(使用实体框架)是相同的(希望数据库也是如此)。

我的问题是,如果我的复制处于活动状态,我的故障转移网站上的某些操作会崩溃。一旦我停用我的复制,操作就会正常进行。

我的猜测是我的故障转移网站的 EntityModel 和数据库在暴露于复制时存在一些并发问题。

有没有人遇到过类似的问题?任何有事务复制 + 实体框架经验的人?

这是我得到的例外:

at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) 
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at System.Data.Objects.ObjectContext.SaveChanges() 
at Library.XXXXEntities.Context_SavingChanges(Object sender, EventArgs e) 
in C:\SVN\Branches\Prod - 1.68.7\Library\LINQ\Audit.cs:line 38 
at System.Data.Objects.ObjectContext.OnSavingChanges() 
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at System.Data.Objects.ObjectContext.SaveChanges() at Library.Provider.Save() 
in C:\SVN\Branches\Prod - 1.68.7\Library\XXXX.Provider.cs:line 57 
at XXXX.mnuExportGeneric.RecreatePositionsToBeUnique() 
at XXXX.mnuExportGeneric.Export(Int32 programId, DirectoryInfo directoryDestination, Boolean exportInventory, Int32 CurrencyListID, Int32 configurationId, Boolean subFolder) 
at XXXX.mnuExport.Export(Int32 ProgramId, String TempExportFolder, String ExportFolder, TreeView treeViewErreurs, Int32 CurrencyListID, Boolean exportInventory, Int32[] configurationsId) 

映射可能存在问题,但仅当事务复制处于活动状态时。

更新:我已经完全脱离了我的应用程序环境,只是在复制“存在”时尝试在故障转移数据库的表中插入新行,而不仅仅是活动接缝非法的。明天我将尝试完全删除复制...或进行更剧烈的更改...

谢谢!

【问题讨论】:

为什么要对故障转移应用程序执行更改?该更改不会反映在主数据库中。您得到什么类型的异常以及您的实体使用什么并发检查? 我正在对故障转移应用程序执行更改作为一项安全措施,以检查一切是否正常。我发起的操作是标准的“业务”操作。而且我的实体正在使用默认的并发检查(我认为那是 AppendOnly)。 【参考方案1】:

这可能不是 EF 的问题,而是您的复制设置的问题。

SQL Server 允许在任何节点进行更改的复制,但这需要企业版,请参阅:http://technet.microsoft.com/en-us/library/ms151196.aspx

您可能正在尝试更新只读副本。

【讨论】:

确实,我一直在阅读,Transactionnal Replication 使我的复制数据库成为只读的。我看到了复制过程使用的特殊存储过程。我想这是有道理的。谢谢!

以上是关于事务复制活动时实体框架模型的问题的主要内容,如果未能解决你的问题,请参考以下文章

实体框架事务和死锁

实体框架对导航属性的约束

如何在原始查询中使用实体框架事务?

以编程方式:列出在实体框架模型中找到的所有存储过程

实体框架 - SaveChanges 与事务

实体框架 创建模型时无法使用上下文