由于我处于早期开发阶段,所以数据库的变化相对较快,因此我通过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自动增加:
这是我失败的代码:
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#是否更干净。
答案 0 :(得分:0)
@jgoday教会了我隔离问题的重要性。他的回答使我感到困惑。