英文:
How to write universal optimistic concurrency Timestamp column that works with SQL Server and with Postgresql
问题
我们需要支持两种数据库:SQL Server 和 Postgresql。对于乐观并发,我们使用了[Timestamp]
列。
对于 SQL Server,这段代码有效:
public class DbEntity
{
...
[Timestamp]
public byte[] Timestamp { get; set; }
...
}
在数据库中,该字段映射为:
[Timestamp] [timestamp] NOT NULL
对于 Postgresql,我们需要类似这样的内容:
public class DbEntity
{
...
[Timestamp]
public uint Version { get; set; }
...
}
不需要在数据库中添加列,因为使用了 xmin 系统列 - 参考链接:https://www.npgsql.org/efcore/modeling/concurrency.html?tabs=data-annotations
是否可能编写通用的实体,使其能在两种数据库中都有效?我希望只需编写一次,而不需要在源代码控制中维护两个应用程序或两个分支。
英文:
We need to support both databases: SQL Server and Postgresql. For optimistic concurrency we use a [Timestamp]
column.
For SQL Server this code works:
public class DbEntity
{
...
[Timestamp]
public byte[] Timestamp { get; set; }
...
}
In the database, this field is mapped to:
[Timestamp] [timestamp] NOT NULL
For Postgresql we need something like this:
public class DbEntity
{
...
[Timestamp]
public uint Version { get; set; }
...
}
without column in database, because xmin system column used - https://www.npgsql.org/efcore/modeling/concurrency.html?tabs=data-annotations
It is possible to write universal entities that works with both databases? I want to write them once, and do not support 2 applications or 2 branches in source control.
答案1
得分: 2
你可以在你的.NET类型上同时拥有这两个属性,并根据使用的提供程序变化EF模型配置,并忽略其他数据库的属性:
public class Blog
{
public int Id { get; set; }
[Timestamp]
public byte[] Timestamp { get; set; }
[Timestamp]
public uint Version { get; set; }
}
// 在模型配置中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (Database.IsSqlServer())
{
modelBuilder.Entity<Blog>().Ignore(b => b.Version);
}
else if (Database.IsNpgsql())
{
modelBuilder.Entity<Blog>().Ignore(b => b.Timestamp);
}
}
英文:
You can use have both properties on your .NET type and vary the EF model configuration based on the provider being used, and ignore the property for the other databases:
public class Blog
{
public int Id { get; set; }
[Timestamp]
public byte[] Timestamp { get; set; }
[Timestamp]
public uint Version { get; set; }
}
// In the model configuration:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (Database.IsSqlServer())
{
modelBuilder.Entity<Blog>().Ignore(b => b.Version);
}
else if (Database.IsNpgsql())
{
modelBuilder.Entity<Blog>().Ignore(b => b.Timestamp);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论