2016-11-14 45 views
1


我是EF(v6.1)的新手。试图使用Code-First方法。
我想要在SQL服务器端生成Id列(newsequentialid()),但可以覆盖这些值。 我的代码:EF6.1 newsequentialid能够手动设置值

[Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid Id { get; set; } 

导致完美SQL:

[Id] [uniqueidentifier] NOT NULL DEFAULT (newsequentialid()) 

但是EF简单地忽略我会设置为Id财产和传递null SQL任意值。本质上以下测试不起作用:

MyContext context = new MyContext(); 
MyClass item = new MyClass(); 
Guid id = Guid.NewGuid(); 
item.Id = id; 
context.MyTable.Add(item); 
context.MyTable.Create(); 
context.SaveChanges(); 
Assert.AreEqual(item.Id, id); 

我该如何做我的测试工作?

+1

只需创建第二个'DbContext'子类,该子类将“MyClass”(但在别名下)映射到同一个表,而不需要'DatabaseGeneratedOption.Identity'。使用这个类来处理特殊情况。 –

回答

1

如果你想手动设置GuidId属性然后取出DatabaseGenerated属性:

[Key] 
public Guid Id { get; set; } 

如果您配置PK财产Identity,将在您的DB.Also可以产生价值,你不需要将此属性标记为Required,默认情况下PK属性是必需的。

+0

我希望它可以像所有时间的99.99%一样由db生成,但是我希望覆盖该行为的能力。没有任何办法吗?在正常的SQL中(给出上面的列配置),如果我确实需要: 'insert into [MyTable] (Id) values ('74C17675-6C85-4C79-9C0C-41E1FA4C059D') ' –

+1

那么,您将需要禁用该列作为身份执行我建议的操作,并稍后使用迁移来修改您的db shema。然后,您应该可以将该行添加特定值,并将该列再次标记为Identity,并生成另一个迁移以将该列作为身份回滚 – octavioccl

+0

查看此链接:https://msdn.microsoft.com/ en-us/library/jj591621(v = vs.113).aspx – octavioccl