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

时间:2017-03-15 02:45:49

标签: c# entity-framework code-first

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

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

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

1 个答案:

答案 0 :(得分:3)

主键有def main(): user_input = input ("Enter string: ") shift = int(input ("Enter a shift that is between 1 and 26: ")) while shift<1 or shift>26: shift = input ("ERROR: Shift must be between 1 and 26: ") encryption (user_input, shift) decryption (cipher_text, shift) frequency (user_input) def frequency(user_input): freq_char = None for char in user_input: charcount = user_input.count(char) if (charcount != 0): freq_char = char print (freq_char) return fre_char def encryption(user_input, shift): cipher_text = '' for char in user_input: #for every character in input if char == ' ': cipher = char cipher_text += cipher else: cipher_num = (ord(char))+(shift)%26 #using ordinal to find the number cipher= '' cipher = chr(cipher_num)# using chr to convert back to a letter cipher_text += cipher print ("The encrypted text is:",cipher_text) return(cipher_text) def decryption (cipher_text, shift): decrypt_text = '' cipher_text = '' for char in cipher_text: #for every character in the encrpted text decrypt_num = (ord(char))+(int(shift))%26 decrypt= '' decrypt = chr(decrypt_num) decrypt_text += decrypt print("The decrypted text is:", decrypt_text) return(decrypt_text) main() 选项。

这意味着 SQL Server知道该ID,并且该知识在实际DatabaseGeneratedOption.Identity到数据库的那一刻实现 (作为相关列)数据库是某种INSERT列。)

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

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

只有在此之后,您的代码才会知道实际密钥,并且能够将其用于您的故障单计算 - 所以基本上您无法避免使用EF的其他SELECT

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

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

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