繁体   English   中英

实体框架和指导

[英]Entity Framework and Guid

假设我有以下代码:

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如何“不同”地工作?

Guid.NewGuid()如何避免与数据库中已有的Guid冲突?

如果没有。 您只是每次都有不同的ID生成。 实际上,产生均等的Guid的机会很小

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

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

var guid = Guid.NewGuid();
context.Foos.Add(new Foo { Id = guid });
context.Foos.Add(new Foo { Id = guid });
context.SaveChanges();

注意:您可以要求Entity Framework在数据库端为您生成GUID键。 为此使用DatabaseGenerated属性:

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

现在,只需保存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

根据MSDN ,它可以被复制的可能性非常低。

备注部分:

GUID是128位整数(16个字节),可在需要唯一标识符的所有计算机和网络中使用。 这样的标识符被复制的可能性非常低。

如果Id是Foo表的Unique/Primary Key ,则如果重复则将引发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM