gpt4 book ai didi

c# - 为什么在插入这些记录时会出现主键冲突? (EF4 代码优先)

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:57 24 4
gpt4 key购买 nike

我有以下实体

public class DocumentHistory
{
public string Name { get; set; }
public string Description { get; set; }
public DateTime DateModified { get; set; }
public User ModifiedbyUser { get; set; }
public string HistoryAction { get; set; }

public virtual int DocumentId { get; set; }
public virtual Document Document { get; set; }
}

在我的 DbContext 中,我使用以下方法定义键:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// DocumentHistory properties
modelBuilder.Entity<DocumentHistory>()
.HasKey(x => new { x.DocumentId, x.DateModified });
}

在我的自动化集成测试中,我初始化一条记录

_doc.HistoryRecords.Add(new DocumentHistory { DateModified = DateTime.Now });

然后我尝试通过以下方式创建新记录:

        // Create the history record
var history = new DocumentHistory
{
Name = doc.Name,
Description = doc.Description,
DateModified = DateTime.Now,
HistoryAction = ScrawlConstants.HistoryActions.Update,
ModifiedbyUser = user
};
doc.HistoryRecords.Add(history);
_context.SaveChanges();

当发生SaveChanges时,会出现以下异常:

System.Data.SqlServerCe.SqlCeException: A duplicate value cannot be inserted into a unique index. [ Table name = DocumentHistories,Constraint name = PK__DocumentHistories__000000000000006E ]

理论上,由于日期时间的不同,每条记录都应该是唯一的,但事实并非如此。我做错了什么?

最佳答案

大多数机器上的时钟精度不够高,无法在您每次读取时产生不同的值。

相反,在典型系统上,精度约为 10-15 毫秒。这意味着在同一“窗口”内连续读取时钟将产生完全相同的值。

参见 DateTime.Now有关此主题的一些信息的文档。不同的文档来源给出了不同的数字,但相关信息是它不够准确。一个来源规定了 1/64 秒,即 15.625 毫秒。

您应该改用保证唯一的东西,例如 Guid(尽管您丢失了数据的排序属性)或使用服务器生成的身份 key 。

关于c# - 为什么在插入这些记录时会出现主键冲突? (EF4 代码优先),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com