Entity framework 为什么实体框架ConcurrencyStamp不使用ROWVERSION/时间戳?

Entity framework 为什么实体框架ConcurrencyStamp不使用ROWVERSION/时间戳?,entity-framework,Entity Framework,我不熟悉EF和以前设计的自定义ORM,它们使用时间戳字段进行并发,并确定与其他数据库同步的记录 为什么EF(核心)使用nvarchar(最大值)来存储看起来像Guid的内容 i、 e.为什么EF做DB可以做的工作 显而易见的是,在某个时候(可能在扩展到多个服务器/数据库时),我们希望在其中存储多个guid,和/或可能仅仅是因为EF针对的DBs上没有一致地实现ROWVERSION/TIMESTAMP (在类似的注释中,为什么ID字段是nvarchar(450)?) 更新: migrationBui

我不熟悉EF和以前设计的自定义ORM,它们使用时间戳字段进行并发,并确定与其他数据库同步的记录

为什么EF(核心)使用nvarchar(最大值)来存储看起来像Guid的内容

i、 e.为什么EF做DB可以做的工作

显而易见的是,在某个时候(可能在扩展到多个服务器/数据库时),我们希望在其中存储多个guid,和/或可能仅仅是因为EF针对的DBs上没有一致地实现ROWVERSION/TIMESTAMP

(在类似的注释中,为什么ID字段是nvarchar(450)?)

更新:

migrationBuilder.CreateTable(
    name: "AspNetRoles",
    columns: table => new
    {
        Id = table.Column<string>(nullable: false),
        ConcurrencyStamp = table.Column<string>(nullable: true),
        Name = table.Column<string>(maxLength: 256, nullable: true),
        NormalizedName = table.Column<string>(maxLength: 256, nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_AspNetRoles", x => x.Id);
    });
migrationBuilder.CreateTable(
名称:“AspNetRoles”,
列:表=>new
{
Id=table.Column(可空:false),
ConcurrencyStamp=table.Column(可空:true),
Name=table.Column(最大长度:256,可为空:true),
NormalizedName=table.Column(maxLength:256,null:true)
},
约束:表=>
{
表.PrimaryKey(“PK_AspNetRoles”,x=>x.Id);
});

这似乎是一个有问题的ASP.NET核心标识设计决策,而不是实体框架核心的问题。它们使用
公共虚拟字符串ConcurrencyStamp{get;set;}
,但对于
行版本
/
时间戳
列,实体框架使用带有附加注释或映射的
字节[]
,以确保EF理解更新后应重新读取的值。发件人:


如果您自己使用EF,您应该能够使用
RowVersion
/
Timestamp
列而不会出现任何问题。

EF不应该为此使用
nvarchar(MAX)
,而在EF6中,它没有。可能在某个地方存在配置问题,但如果这在EF Core中真的发生了变化,我怀疑这是一个bug,而不是一个特性。您能显示您的类定义和映射,以及生成的表吗?旁白:“(在一个类似的注释中,为什么ID字段是nvarchar(450)?”——这是不相关的,可能最好省去它,但请注意,如果您只是将其设置为
nvarchar(MAX),您应该能够在SQL Server的警告中发现问题
在EF之外。下面是另一篇关于数据类型屏幕截图的帖子:我通常会因为在匆忙中尝试实现新框架,然后在不理解某些标准/惯例的情况下重新发明轮子而感到内疚(毫无疑问,这很糟糕)。我在这里尽量避免这种情况。在这里使用字符串肯定是有原因的,我想知道我的项目的很大一部分将包括可伸缩的并发性和同步问题。但我同意你的看法,现在在我看来,这是一种身份上的设计选择,而不是EF。
public class Two
{
    [Key]
    public int Id { get; set; }

    [StringLength(16)]
    public string Data { get; set; }

    [Timestamp]
    public byte[] Timestamp { get; set; }

    public virtual C NavC { get; set; }
}