Cie*_*iel 9 c# entity-framework guid newsequentialid ef-migrations
有没有办法使用CodeFirst设计为新的Entity Framework 4.1中的对象实现Guid COMB身份策略?我认为设置StoreGeneratedPattern会工作,但它仍然给我正常的GUID.
Tho*_*mas 16
为什么要担心数据库中Guid列的默认值呢?为什么不像其他任何值一样在客户端上生成Guid.这要求您在客户端代码中有一个方法,它将生成类似COMB的guid:
public static Guid NewGuid()
{
var guidBinary = new byte[16];
Array.Copy( Guid.NewGuid().ToByteArray(), 0, guidBinary, 0, 8 );
Array.Copy( BitConverter.GetBytes( DateTime.Now.Ticks ), 0, guidBinary, 8, 8 );
return new Guid( guidBinary );
}
Run Code Online (Sandbox Code Playgroud)
Guid的一个优点是,您可以在客户端生成它们而无需往返数据库.
我猜你使用SQL服务器作为你的数据库.这是不同MS工具之间不一致的一个很好的例子.SQL Server团队不建议将列newid()用作UNIQUEIDENTIFIER列的默认值,如果Guid在数据库中将property 指定为autogenerated,则ADO.NET团队会使用它.他们应该使用newsequentialid()!
如果你想要数据库生成的顺序Guids,你必须修改生成的表,它真的很复杂,因为你必须找到自动生成的默认约束,删除它并创建新的约束.这一切都可以在自定义数据库初始化程序中完成.这里有我的示例代码:
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new CustomInitializer());
using (var context = new Context())
{
context.TestEntities.Add(new TestEntity() { Name = "A" });
context.TestEntities.Add(new TestEntity() { Name = "B" });
context.SaveChanges();
}
}
}
public class CustomInitializer : DropCreateDatabaseAlways<Context>
{
protected override void Seed(Context context)
{
base.Seed(context);
context.Database.ExecuteSqlCommand(@"
DECLARE @Name VARCHAR(100)
SELECT @Name = O.Name FROM sys.objects AS O
INNER JOIN sys.tables AS T ON O.parent_object_id = T.object_id
WHERE O.type_desc LIKE 'DEFAULT_CONSTRAINT'
AND O.Name LIKE 'DF__TestEntities__Id__%'
AND T.Name = 'TestEntities'
DECLARE @Sql NVARCHAR(2000) = 'ALTER TABLE TestEntities DROP Constraint ' + @Name
EXEC sp_executesql @Sql
ALTER TABLE TestEntities
ADD CONSTRAINT IdDef DEFAULT NEWSEQUENTIALID() FOR Id");
}
}
public class TestEntity
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Context : DbContext
{
public DbSet<TestEntity> TestEntities { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<TestEntity>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7687 次 |
| 最近记录: |