假设我有这个代码:
var foo = new Foo { Id = Guid.NewGuid(); }
var id = foo.Id; // have access to the id here
context.Add(foo);
context.SaveChanges();
Guid.NewGuid()
如何避免与数据库中已有的 Guid 发生冲突?如果生成的 guid 已存在于数据库中怎么办?我不明白。
使用自动增量 id 是显而易见的,但在保存到数据库之前我不会知道 id,这是有意义的。 guid 如何使其工作“不同”?
最佳答案
How does Guid.NewGuid() avoid collision with a Guid already on my Database?
如果没有。只是每次都会生成不同的 id。实际上生成相等Guid的机会是very low .
What if the generated guid already exists on the database?
如果您提供相同的 Guid 值,则会违反主键约束。以下代码将产生无法插入重复键错误
var guid = Guid.NewGuid();
context.Foos.Add(new Foo { Id = guid });
context.Foos.Add(new Foo { Id = guid });
context.SaveChanges();
注意:您可以要求 Entity Framework 在数据库端为您生成 guid key 。使用DatabaseGenerated属性:
public class Foo
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public int Value { get; set; }
}
现在只需保存 Foo 而无需手动生成 key ,EF 将使用数据库生成的 guid 更新 id:
var foo = new Foo { Value = 42 };
context.Foos.Add(foo); // id is 00000000-0000-0000-0000-000000000000
context.SaveChanges();
// now id has value generated during insert 421ffa94-1970-e311-9e31-001fd09468de
关于c# - Entity Framework 和指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820403/