Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架核心配置标识列?_C#_Entity Framework Core - Fatal编程技术网

C# 如何使用实体框架核心配置标识列?

C# 如何使用实体框架核心配置标识列?,c#,entity-framework-core,C#,Entity Framework Core,如何在实体框架核心中创建自动增量标识列 显然,我可以使用fluent API for EF6来实现这一点。因为EF7文档很少,我们知道我们必须从源代码或单元测试中收集到很多东西。根据EF7源中的以下两个单元测试 及 您将为标识配置一个属性,如下所示: b.Property(e => e.Id).ForSqlServer().UseIdentity(); ForSqlServer().UseSequence(); 您可以为如下序列配置属性: b.Property(e => e.I

如何在实体框架核心中创建自动增量标识列


显然,我可以使用fluent API for EF6来实现这一点。

因为EF7文档很少,我们知道我们必须从源代码或单元测试中收集到很多东西。根据EF7源中的以下两个单元测试

您将为标识配置一个属性,如下所示:

b.Property(e => e.Id).ForSqlServer().UseIdentity();
ForSqlServer().UseSequence();
您可以为如下序列配置属性:

b.Property(e => e.Id).ForSqlServer().UseIdentity();
ForSqlServer().UseSequence();

由于aspnet核心reorg,URL发生了更改,并且自第一次提出此问题以来,方法也发生了更改

这些url可能会再次更改(这就是我包含相关代码的原因),但只需查看url并转到站点并找出新的url是什么,就非常容易了

事实上,我的答案的全部要点是,您可以通过查看GitHub上源代码中的单元测试来自己解决这个问题。你不需要有人用勺子喂你


编辑:更新了到2.1版的链接(仍然适用于1.1和2.0)

以下是如何在需要或不是默认行为的情况下明确执行此操作

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
  modelBuilder.Entity<MyEntity>(b =>
  {
    b.Key(e => e.Identifier);
    b.Property(e => e.Identifier).ForSqlServer().UseIdentity();
  }
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{    
modelBuilder.Entity(b=>
{
b、 键(e=>e.Identifier);
b、 属性(e=>e.Identifier).ForSqlServer().UseIdentity();
}
}

使用最新的bits EF Core 1.0及以上版本,您应该使用

builder.Entity<ApplicationUser>().Property<int>(nameof(ApplicationUser.AccountNo))
            .UseSqlServerIdentityColumn()
builder.Entity().Property(nameof(ApplicationUser.AccountNo))
.UseSqlServerIdentityColumn()

在最新版本的EF7中,有一种新的扩展方法来设置标识列

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
  modelBuilder.Entity<MyEntity>(b =>
  {
    b.HasKey(e => e.Identifier);
    b.Property(e => e.Identifier).ValueGeneratedOnAdd();
  });
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{    
modelBuilder.Entity(b=>
{
b、 HasKey(e=>e.Identifier);
b、 属性(e=>e.Identifier);
});
}

看起来他们又改变了它,现在新方法是:

.UseIdentityColumn()

我认为没什么特别的,Id字段的默认工作方式是递增的标识列。这给了你一个问题吗?默认情况下,它被更改为一个序列。:(我自己还没有使用EF7,但当我查看时,每个模型都只有一个
int Id
字段作为主键“在EF7中,将列配置为标识仍然很容易,我们只是考虑将默认列设置为序列而不是标识。"~@andreduffy我看到许多不同的答案在变化,随着框架的更新版本而变化。目前,被接受的答案不是最合适的答案。请您修改并重新接受,以便为未来的读者指出哪一个是首选答案,好吗?谢谢。UseSqlServerIdentityColumn就是这样做的现在,包括RC1 final,所以我想这个API将继续。谢谢,更新答案以明确指出RC1 supportedI接收到这个错误,我如何修复这个错误?@AppleBook89-这似乎仍然被使用,您是否包括正确的命名空间?请参阅当前的单元测试:我得到“MissingFieldException”:未找到字段当使用标识列时。我找不到原因。我使用的是DB优先方法。@SuyashGupta-这意味着所需列的名称不是EF所需的名称。您可能需要手动映射它。列名在代码和DB中是相同的。只有当我将主键设置为标识列时才会出现问题。如果emove identity属性,插入操作不会出现任何问题。注意:ValueGeneratedOnAdd实际上并没有将列设置为identity列,否则将失败。通过官方文档和@ErikFunkenbusch进行证实,您确定吗?I它相当于带有identity!@S.serpoosan的
DatabaseGenerated
属性非官方文档。请参阅注释
这只是让EF知道为添加或更新的实体生成了值,并不保证EF会设置生成值的实际机制。
我刚刚检查了生成的数据库,SQL Server中的列定义为“is Identity”=是