![](/img/trans.png)
[英]How can I have the primary key of one entity be another entity in EF4 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.