代码之家  ›  专栏  ›  技术社区  ›  Buildstarted

具有整数主键但不是auto int的实体框架不会传递到数据库

  •  2
  • Buildstarted  · 技术社区  · 14 年前

    这是桌子和密码

    public class Person {
        [Key] public int ID {get;set;}
        public string Name {get;set;}
    }
    
    var owner = new Person() { ID = 1, Name = "Owner" };
    db.People.Add(Person);
    db.SaveChanges();
    

    savechanges方法不向SQL添加ID,因此最终得到以下SQL查询

    exec sp_executesql N'insert [dbo].[People]([Name])
    values (@0)
    select [ID]
    from [dbo].[People]
    where @@ROWCOUNT > 0 and [ID] = scope_identity()',N'@0 varchar(50),@0='Owner'
    

    而不是传入ID为的预期insert语句。

    是否需要其他属性来确保ID作为查询的一部分传递?

    我肯定会被问到,但这不是故意的自动递增。

    2 回复  |  直到 9 年前
        1
  •  2
  •   ahmad molaie    9 年前

    在EF 5中,答案是

    this.HasKey(t => t.UserID)
        .Property(p => p.UserID)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    

    DatabaseGeneratedOption.Computed 当字段计算在SQL Server内部完成时使用。

        2
  •  0
  •   Buildstarted    14 年前

    奇怪的是,这是其他可能遇到这个问题的人的答案。

    modelBuilder.Entity<Person>()
                .HasKey(p => p.ID)
                .Property(p => p.ID)
                .StoreGeneratedPattern = StoreGeneratedPattern.Identity;
    

    希望这能帮助别人。