这是我将插入数据库的实体:
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()
值?
答案 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是只读的)。