使用 EntityFramework 5,我有一个新数据库,我需要在其中将表上的标识种子指定为“1”以外的值。
使用模型构建器、迁移或其他方式,是否有一种简单的方法可以更改表的身份生成以处理此问题?
目前,我正在考虑创建自定义 sql,以便在迁移期间调用以在创建表后对其进行修改。一个更清洁的解决方案是首先让 CREATE TABLE 正确。
使用 EntityFramework 5,我有一个新数据库,我需要在其中将表上的标识种子指定为“1”以外的值。
使用模型构建器、迁移或其他方式,是否有一种简单的方法可以更改表的身份生成以处理此问题?
目前,我正在考虑创建自定义 sql,以便在迁移期间调用以在创建表后对其进行修改。一个更清洁的解决方案是首先让 CREATE TABLE 正确。
我正在处理同样的问题,现在遵循以下计划:
通过以下方式初始化定制的迁移计划:
Database.SetInitializer(new MigrateDatabaseToLatestVersion());
检查是否必须生成实体(MyInitConfiguration 类):
protected override void Seed(MyDbContext context)
{
var he = context.Set<MyEntity>();
if (!he.Any(h => h.Id == 0))
{
...place to add code...
以正常方式添加实体(或多个实体),但“在执行提交之前 - 调用外部 sql 脚本:
he.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"});
he.Add(new MyEntity{ Id = -4, Alias = "system1",Title = "System1"});
he.Add(new MyEntity{ Id = -3, Alias = "system2",Title = "System2"});
context.Database.ExecuteSqlCommand(
string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});",-5,"MyTableName")
);
context.Commit();
或以下我为 DBContext 准备的扩展:
public static void UpdateIdentity<T, TKey>(this MyDbContext context, Func<T> data, TKey staticPreviousId, string tableName,string columnName="id")
where T : MyEntity<TKey>
{
var r = data();
context.Database.ExecuteSqlCommand(string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});", staticPreviousId, r.Id, tableName, columnName));
context.Commit();
}
然后执行:
context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"}), -5, "myTableName");
context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = 81, Alias = "system",Title = "System"}), 80, "myTableName");
不幸的是,我还没有找到在执行查询批处理之前“添加预查询”的方法,如果有人能找到这样做的方法 - 然后在执行提交之前 - 我们可以执行 sql:“set identity_inster on”
后
“设置 identity_inster 关闭”
这对 t-sql 来说更自然