2016-11-14 50 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