Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用GUID在实体框架中创建唯一的主键,并在发现重复项时重新生成GUID?_C#_.net_Entity Framework_Ef Code First - Fatal编程技术网

C# 如何使用GUID在实体框架中创建唯一的主键,并在发现重复项时重新生成GUID?

C# 如何使用GUID在实体框架中创建唯一的主键,并在发现重复项时重新生成GUID?,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我有一个CodeFirst实体框架数据库。我自己正在生成GUID,模型中定义了以下内容: [Required, Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)] public string BatchId { get; set; } 我的目标-是否有一种方法可以首先验证GUID在数据库中是否不存在,然后根据需要创建一个新的GUID,

我有一个CodeFirst实体框架数据库。我自己正在生成GUID,模型中定义了以下内容:

    [Required, Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]
    public string BatchId { get; set; }

我的目标-是否有一种方法可以首先验证GUID在数据库中是否不存在,然后根据需要创建一个新的GUID,直到找到唯一的GUID?

这不是
GUID
,而是
字符串
;最好将其声明为
Guid
,这样就不必担心了

实际上,相同的
Guid
不会在同一台机器上生成两次。因此,如果您将财产更改为:

[Required, Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]
    public Guid BatchId { get; set; }

这是我自己编写的一个旧代码:

private static IQueryable<MyData> FetchFromDatabase(MyContainer context, Guid guid)
{
    if (!context.DatabaseExists())
        throw Constants.ExceptionDatabaseMissing;

    return from data in context.MyDataSet
           where data.GUID.Equals(guid)
           select data;
}
私有静态IQueryable FetchFromDatabase(MyContainer上下文,Guid)
{
如果(!context.DatabaseExists())
抛出常量。异常DatabaseMissing;
从context.MyDataSet中的数据返回
其中data.GUID.Equals(GUID)
选择数据;
}

只需检查返回值是否包含任何内容。如果是,则您有一份副本。

请务必先读取数据库以确定是否正确。但是E=MC^2或者你的钱回来了

Context.DbSet.find(MyGuid);
不,找不到。。。。 如果使用Guid.New(),请在获得dup时通知我们


顺便问一下,您是否计划对gUid或类型gUid/DBType UniqueIdentier使用字符串?如果是这样,您应该重新考虑选择的类型。

Eh。。。你知道“GUID”中的“U”代表什么吗?没错,它是唯一的。但是如果它创建得太快,而且时钟没有移动,我相信有可能会产生重复,所以我想确保不会发生这种情况。
-1
pendraggon87运行一些压力测试,并告诉我们是否以及何时找到重复的GUID。。你会有更好的机会中彩票或者被闪电击中两次,或者使用重复的GUID?不,如果那样的话,你的发电机会严重损坏。时间只用于播种,它只是随机性的一小部分。但是,您必须意识到,作为主键的(随机)GUID可能会严重影响您的DB性能。相同的GUID不会在全局范围内生成两次。或者您可以只使用一个标识列,并确保它是唯一的(对于该表),同时消耗更少的内存、处理器周期,开发人员的努力…@DanielHilgarth理论上可以产生相同的GUID,但是“这样的标识符被复制的概率非常低。”@daryal:的确如此。您制定它的方式,听起来好像只保证在一台机器范围内,第二台机器可以轻松生成相同的GUID-事实并非如此。@DanielHilgarth您是对的,可能是因为措词不当。当创建两个重复的GUID时,他们都检查并发现它不存在,然后添加项目。您需要使用一个事务来检查,然后添加项目或不添加项目,这才是一个可行的选项。(或者完全避免这个问题,让DB生成ID。)既然你有27k代表,我就假设你在跟踪,@Servy。另一种选择是令人尴尬的。@tricker如果你认为你的guid是正确生成的,并且从来没有重复的,那么就没有理由去检查,如果你知道你使用的标识符生成方法可能会发生冲突(在实际意义上),那么你就需要正确地检查。我的观点是,你根本不应该这样做,但如果你这样做了,至少要做对。你不能生成两个相似的Guid,因为根据定义,Guid是全局唯一的。如果您自己生成某种可能与自身冲突的ID,则它不再是Guid。所以,不,你不能有重复的guid。如果你打算这样做的话,关于如何正确操作的合理评论。但我认为一个简单的方法是如何快速找到钥匙,如果钥匙被使用,这就是他想要的。这一事实毫无意义,很可能现在已经被其余的注释弄清楚了:-)当创建两个重复的guid时,它们都会检查并发现它不存在,然后添加该项。您需要使用一个事务来检查,然后添加项目或不添加项目,这才是一个可行的选项。(或者完全避免这个问题,让DB生成ID。)@Servy我的旧代码是用来修改的。重复的GUID在那里很常见,因为同一分支的每个版本都有相同的GUID。我使用此代码查找来自同一分支(不同名称)的任何和所有数据,并确保没有人可以上载具有不同GUID但名称相同的数据(名称冲突)。就像我说的,这是旧代码。我不希望任何人只是复制粘贴到自己的代码中。