我们需要支持这两个数据库: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

是否有可能编写同时使用这两个数据库的通用实体?我想写一次,不支持2个应用程序或2个分支的源代码控制.

推荐答案

您可以在.NET类型上使用这两个属性,并根据正在使用的提供程序改变EF模型配置,而忽略其他数据库的属性:

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);
    }
}

Csharp相关问答推荐

AutoMapper -如何为两个不同的用例设置单个映射?

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

将列表字符串映射为逗号分隔字符串<>

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

有没有办法在WPF文本框中添加复制事件的处理程序?

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

异步实体框架核心查询引发InvalidOperation异常

HttpClient 415不支持的媒体类型错误

NET8 MAUI并部署到真实设备上进行测试

使用Entity Framework6在对象中填充列表会导致列表大多为空

在C#中过滤Excel文件

基于C#和ANGING的SignalR实时聊天流媒体应用

在被Interactive Server切换后,Blazor SSR页面无法正确加载JS

使用C#和.NET 7.0无法访问Cookie中的数据

Visual Studio如何使用当前的框架?

SharpZipLib在文件名前加上目录名,生成tar.gz

如何在Cake脚本中设置MSBuild.exe的绝对路径

.NET6最小API:操作.MapGet之后的响应

将带有嵌套If-Else的Foreach循环转换为Linq表达式

异步等待,如何在Windows窗体中使用它们?