我首先使用代码和EF 6创建了一个小项目,但现在我遇到了一个问题:
客户端想要一个MySql数据库(我们称它为OnlineDbContext)和一个SqlServerCe4.0与(我们称它为OfflineCotext),并且想要与在线同步(方向,在线->离线)。
到目前为止,我创建了BaseContext,以及另外两个上下文(OfflineContext和OnlineContext继承自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(我们将其称为...
使用Gert Arnold建议,我在OfflineContext