同步两个dbcontext的数据(不同的提供程序)

问题描述 投票:1回答:1

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

客户端想要一个MySql数据库(我们称它为OnlineDbContext)和一个SqlServerCe4.0与(我们称它为OfflineCotext),并且想要与在线同步(方向,在线->离线)。

到目前为止,我创建了BaseContext,以及另外两个上下文(OfflineContextOnlineContext继承自BaseContext)。

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

这可行,但是有一个问题:

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

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

[我在这里发现了有关以编程方式生成ID的有趣post,但它是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));
        }

现在正在工作,谢谢

我首先使用代码和EF 6创建了一个小项目,但是现在我遇到了一个问题:客户端需要一个MySql数据库(我们将其称为OnlineDbContext)和一个SqlServerCe4.0 with(我们将其称为...

c# entity-framework ef-code-first code-first dbcontext
1个回答
2
投票

使用Gert Arnold建议,我在OfflineContext

© www.soinside.com 2019 - 2024. All rights reserved.