实体框架和指导

Bar*_*xto 2 .net c# entity-framework guid

假设我有这段代码:

var foo = new Foo { Id = Guid.NewGuid(); }

var id = foo.Id; // have access to the id here

context.Add(foo);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

如何Guid.NewGuid()在我的数据库中避免与Guid冲突?如果生成的guid已经存在于数据库中怎么办?我不明白.

使用autoincrement id是显而易见的,但在保存到有意义的数据库之前我不会知道id.guid如何使它"工作不同"?

Ser*_*kiy 5

Guid.NewGuid()如何避免与我的数据库中的Guid发生冲突?

如果没有.您每次只生成不同的ID.实际上产生相等Guids的几率非常低.

如果生成的guid已经存在于数据库中怎么办?

如果您将提供相同的Guid值,则会违反主键约束.以下代码将产生无法插入重复键错误

var guid = Guid.NewGuid();
context.Foos.Add(new Foo { Id = guid });
context.Foos.Add(new Foo { Id = guid });
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

注意:您可以要求Entity Framework为您在数据库端生成guid密钥.使用DatabaseGenerated属性:

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public int Value { get; set; }
}    
Run Code Online (Sandbox Code Playgroud)

现在只需保存Foo而不手动生成密钥,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
Run Code Online (Sandbox Code Playgroud)