【问题标题】:Entity Framework 7 IDENTITY_INSERT实体框架 7 IDENTITY_INSERT
【发布时间】:2016-04-16 05:00:48
【问题描述】:

我需要在数据库中存储大量用户数据,其中每个用户都已经拥有一个 ID 作为键。但是,这些用户都是从一个更大的用户池中出来的,因此,ID不会增加,也不能自动生成。我需要能够手动设置 ID。

有没有简单的方法来做到这一点?

【问题讨论】:

  • 您是否也有引用这些 ID 的相关数据?无论哪种方式,听起来 EF 都不是适合这项工作的工具 - 考虑使用 ETL 工具或编写相应的 INSERT 语句的脚本。
  • 您不能直接进入 .edmx 文件并将该属性的 SoreGeneratedPattern 设置为“none”吗?还是我在这里遗漏了什么?
  • @Dave 我不认为 EF7 使用 edmx 文件
  • 嗯,那会很有趣。

标签: c# sql entity-framework asp.net-core entity-framework-core


【解决方案1】:

我进行了一些测试,这似乎对我在 EF 7.0.0 rc1-final 上有效:

modelBuilder.Entity<Foo>().HasKey(x => x.Id);
modelBuilder.Entity<Foo>().Property(x => x.Id).ValueGeneratedNever();    

我的测试代码:

static void Main(string[] args)
{
    using (var db = new FooContext())
    {
        var myFoo = new Foo {Id = 1002, Descr = "Test"};
        db.Add(myFoo);
        db.SaveChanges();
    }
    using (var db = new FooContext())
    {
        var myFoo = db.Foos.FirstOrDefault(x => x.Id == 1002);
        Console.WriteLine($"id = {myFoo?.Id}, descrip = {myFoo?.Descr}");
    }
}

(此处为完整程序代码:http://pastebin.com/hSs9HZCP

它正确地插入和检索具有指定 id 的记录,并且该表具有指定的正确主键。

这是生成的迁移代码:

migrationBuilder.CreateTable(
    name: "Foo",
    columns: table => new
    {
        Id = table.Column<long>(nullable: false),
        Descr = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Foo", x => x.Id);
    });

【讨论】:

  • 如果数据库字段已配置为身份字段,设置DatabaseGeneratedOption.None 将无济于事。数据库仍然不允许您手动提供身份。您需要在表上允许 IDENTITY INSERT。看看这个博客。 blog.robertobonini.com/2014/10/09/…
  • @jvanrhyn 我明白了,我从未亲自尝试过。我要做一个快速项目并检查
  • 我做了一个简单的测试,它对我有用,只是 EF7 的语法错误(这是 EF6),我正在更新
猜你喜欢
  • 1970-01-01
  • 2013-04-19
  • 2011-06-27
  • 1970-01-01
  • 2011-10-27
  • 2011-06-27
  • 2014-03-29
  • 2016-07-07
  • 2016-07-12
相关资源
最近更新 更多