我正在使用代码和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));
}
现在它的作品,谢谢
答案 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));
}
现在它们完全同步。