如何通过带有支持C#实体的F#通过EF Core添加具有自动生成ID的行?

时间:2019-03-17 18:01:22

标签: c# f# ef-core-2.2

由于我处于早期开发阶段,所以数据库的变化相对较快,因此我通过Scaffold-DbContext生成了实体,从而生成了C#:

public partial class User 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// And in the DbContext:
modelBuilder.Entity<User>(entity => {
    entity.ToTable("User");
    entity.Property(e => e.Name)
        .IsRequired()
        .HasMaxLength(32)
        .IsUnicode(false);
});

这会使我的PK自动增加:

enter image description here

这是我失败的代码:

module DbFactory =
    let options = DbContextOptionsBuilder().UseSqlServer("connectionstring").Options
    let create () = new MyDb(options)
module DbService =
    let command (q) : unit =
        use db = DbFactory.create ()
        q db |> ignore
        db.SaveChanges () |> ignore
let h = User (
        Id = Unchecked.defaultof<int>, // I've also tried -1, 0, 1, null, and removing this row entirely
        Name = "bork")
DbService.command (fun db -> db.Users.Add h)

由于我设置了Id,因此EF引发了以下错误:

  

System.Data.SqlClient.SqlException:当IDENTITY_INSERT设置为OFF时,无法为表'User'中的标识列插入显式值。

此未设置ID的C#代码不会发生错误:

var c = new DbFactory();
var user = new User() {
  Name = "bork",
};

var db = c.Create();
db.Users.Add(user);
db.SaveChanges();

如何使我的F#看起来没有设置Id?由于这不是记录类型(我认为是CLIMutable),因此我尝试了User (Name = "bork"),但由于相同的错误而失败。

我也是F#的新手,所以让我知道我的F#是否更干净。

1 个答案:

答案 0 :(得分:0)

@jgoday教会了我隔离问题的重要性。他的回答使我感到困惑。