c# - Entity Framework 和指南

标签 c# .net 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();

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/

相关文章:

c# - Visual C# 2013 - 在 WPF 表单编辑器中添加新元素时元素消失

c# - 从 MVC 4 调用 Web API 方法

c# - 操纵 setter 以避免 null

asp.net - JwtSecurityToken 理解与异常

c# - 如何使用 Linq 从一系列的 3 个表中进行选择?

c# - 如何在 GridView 中拥有具有相同字段但不同值的两列

c# - C#,方法“ToList”的无重载采用1个参数

.net - 通过 TeamCity 在 docker 容器内恢复私有(private) NuGet 服务器

asp.net-mvc-3 - EF 在哪里创建我的数据库?如果是。

c# - LINQ:将 SQL WITH 子句转换为 LINQ 和 Entity Framework