【发布时间】:2013-04-30 19:35:56
【问题描述】:
我来自休眠背景,我想知道如何在服务器端自动生成 Guid,而不是在数据库端进行往返?
在流畅的nhibernate中它很简单
Id(x => x.Id).GeneratedBy.GuidComb();
【问题讨论】:
标签: entity-framework guid
我来自休眠背景,我想知道如何在服务器端自动生成 Guid,而不是在数据库端进行往返?
在流畅的nhibernate中它很简单
Id(x => x.Id).GeneratedBy.GuidComb();
【问题讨论】:
标签: entity-framework guid
如果您想在服务器上生成密钥,只需在代码中执行此操作:
public class TestObject
{
public TestObject()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
}
如果希望数据库生成密钥,则使用DatabaseGenerated 属性:
public class TestObject
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}
如果您在使用顺序 GUID,那么目前没有简单的答案。一些帮助您走上正确道路的示例:
【讨论】:
此代码可以满足您的需要:
using System;
using System.Runtime.InteropServices;
public static class SequentialGuidProvider
{
[DllImport("rpcrt4.dll", SetLastError = true)]
private static extern int UuidCreateSequential(out Guid guid);
private static Guid CreateGuid()
{
Guid guid;
int result = UuidCreateSequential(out guid);
if (result == 0)
return guid;
else
return Guid.NewGuid();
}
public static Guid GuidComb(this Nullable<Guid> guid)
{
if (!guid.HasValue) guid = SequentialGuidProvider.CreateGuid();
return guid.Value;
}
}
测试类:
public class TestObject
{
public TestObject()
{
}
private Nullable<Guid> _guid = null;
public Guid Id
{
get
{
_guid = _guid.GuidComb();
return _guid.Value();
}
set
{
_guid = value;
}
}
}
测试代码:
static void Main(string[] args)
{
TestObject testObject1 = new TestObject();
TestObject testObject2 = new TestObject();
TestObject testObject3 = new TestObject();
//simulate EF setting the Id
testObject3.Id = new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594");
//same object same id
bool test1 = testObject1.Id == testObject1.Id;
//different object different id
bool test2 = testObject1.Id != testObject2.Id;
//EF loaded object has the expected id
bool test3 = testObject3.Id.Equals(new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594"));
}
【讨论】:
从 EF 6.1.3 开始,将 GUID 用作 PK 时,数据库默认值 [newsequentialid() 或 newid()] 可能很重要
见entity framework use a guid as the primary key。
【讨论】: