同步两个dbcontexts的数据(不同的提供者)

时间:2014-02-07 21:34:48

标签: c# entity-framework ef-code-first code-first dbcontext

我正在使用代码和ef 6创建一个小项目,但现在我遇到了一个问题:

客户端想要一个MySql数据库(让我们称之为 OnlineDbContext )和一个SqlServerCe4.0(让我们称之为 OfflineCotext ),并希望将离线同步到在线(方向,在线 - >离线)。

到目前为止,我创建了一个 BaseContext ,还有两个上下文( OfflineContext OnlineContext 继承自 BaseContext

他们工作正常。此外,我创建了一个算法,从 OnlineContext 复制所有实体(和关系),并使用单个SaveChanges()保存在 OfflineContext 中。

这有效,但有一个问题:

如果实体具有AutoID PK,例如3个entites(Id:1,Id:2,Id:4 - Id3已删除), 克隆上下文将具有实体(Id:1,Id:2,Id:3)。

我的问题:有没有办法强制AI PK的价值,或者至少强制跳过ID?或者,是否有通过DbContexts将数据库复制到另一个数据库的最佳方法?

我在这里找到了一个有趣的post关于以编程方式生成ID,但它是使用Java和Hibernate。如果我可以用ef做这样的事情,我想我可以解决这个问题。

编辑:

我尝试使用Gert Sugestion,但是有一个问题:

如果我把这段代码放在BaseContext中:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

            modelBuilder.Properties().Where(p => p.Name.ToLower().Contains("id"))
                    .Configure(p => p.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
        }

它确实有效,但这导致我的OnlineContext没有AutoIds,那不是目标,所以我把这段代码只放在我的OfflineContext中:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Properties().Where(p => p.Name.ToLower().Contains("id"))
                    .Configure(p => p.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
        }

现在它的作品,谢谢

1 个答案:

答案 0 :(得分:2)

使用Gert Arnold建议,我使用 OfflineContext 上的Fluent API进行了一些更改,以便不使用AutoID:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Properties().Where(p => p.Name.ToLower().Contains("id"))
                    .Configure(p => p.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
        }

现在它们完全同步。