繁体   English   中英

EF Code-first,如何在插入时将主键插入另一个字段?

[英]EF Code-first, how to insert primary key to another field when inserting?

这是我将插入数据库的实体:

public sampleEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PrimaryKey { get; set; }

    [Required]
    public string Ticket { get; set; }
}

Ticket的格式如下

string.Format("{0:yyyyMMdd}-{1}", DateTime.Now, PrimaryKey);

因此,当我将此实体添加到上下文时, primaryKey始终为0,因此Ticket值始终为'20170315-0'

现在我的解决方案是

// first add row and save
SampleEntity sample = new SampleEntity {
    Ticket=DateTime.Now.ToString("yyyyMMdd")
};
context.Samples.Add(sample);
context.SaveChanges();

// then find it out and update
var latest = context.Samples.OrderByDecending(p => p.PrimaryKey).First();
latest.Ticket += sample.PrimaryKey.ToString();
context.SaveChanges();

如果SaveChanges()没有更新,如何根据primaryKey值设置Ticket值?

您具有主键的DatabaseGeneratedOption.Identity选项。

这意味着只有 SQL Server知道该ID,并且该知识在实际INSERT到数据库的那一刻才具体化(因为数据库中的相关列是某种IDENTITY列)。

例如,要理解两个应用程序同时将新记录插入数据库 - 它们将接收不同的密钥,但您无法确定哪个应用程序接收哪个密钥。

实体框架将为SaveChanges生成两个请求 - 第一个是INSERT ,另一个是SELECT以接收生成的密钥。

只有在那之后你的代码才能知道实际的密钥,并且能够将它用于你的票据计算 - 所以基本上你不能避免使用EF的另一个UPDATE

你可以做的是改变由你的代码而不是数据库控制的东西的主键类型 - 例如,随机GUID; 在这种情况下,您将插入之前知道ID 并且可以以您想要的任何方式使用它。

但是对于主键使用说GUID会导致其他并发症,这在大多数情况下都是不值得的,例如非顺序插入会导致索引重建,仍然存在键冲突的可能性,保留列等的更多空间等。

另一种选择是在应用程序中为故障列提供计算列或类似逻辑,因此您将拥有单独的Date列和单独的Id列,但对于故障单,您将始终在需要时始终应用concat逻辑,创建计算列将是仅返回值(因此对于数据库和EF将是只读的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM