【发布时间】:2014-08-07 13:17:18
【问题描述】:
我有一个具有Auto-identity (int) 列的实体。作为数据种子的一部分,我想在我的系统中为“标准数据”使用特定的标识符值,之后我想让数据库整理出 id 值。
到目前为止,我已经能够将 IDENTITY_INSERT 设置为 On 作为插入批处理的一部分,但 Entity Framework 不会生成包含 Id 的插入语句。这是有道理的,因为模型认为数据库应该提供值,但在这种情况下,我想提供值。
模型(伪代码):
public class ReferenceThing
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id{get;set;}
public string Name{get;set;}
}
public class Seeder
{
public void Seed (DbContext context)
{
var myThing = new ReferenceThing
{
Id = 1,
Name = "Thing with Id 1"
};
context.Set<ReferenceThing>.Add(myThing);
context.Database.Connection.Open();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT ReferenceThing ON")
context.SaveChanges(); // <-- generates SQL INSERT statement
// but without Id column value
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT ReferenceThing OFF")
}
}
谁能提供任何见解或建议?
【问题讨论】:
-
通常当我在我的代码中看到这样的东西时,我会觉得设计有问题。如果
Id不是一个身份,则不要将其设为一个身份...如果您需要表中ID 为1 的内容,您可能需要为标识符添加一个额外的列。通常,我的查找表有一个 ID、一个用于内部引用的名称和一个显示在 UI 中的描述。 -
@Tallmaris 好点,我也有同感,但对“超级”用户有一个模糊的要求,即能够编写跨多个安装运行的 SQL 报告,因此要保留报告代码更简单的是,我们决定尝试已知的 Id 值。我这里几乎可以开一罐虫子了……
标签: c# entity-framework entity-framework-6