当我通过EF向SQL添加值时,ID始终为0

时间:2017-08-24 13:57:47

标签: c# entity-framework

  • 我有一个与实体框架(db first)连接的MVC项目。
  • 我有一个班级User,每当我尝试将其添加到数据库时,ID 0create table Users ( ID bigint not null primary key, FirstName nvarchar(50) not null, LastName nvarchar(50) not null, BirthDate smalldatetime not null, Email varchar(50) not null, UserName nvarchar(50) not null, Password nvarchar(50) not null )
  • 我尝试通过向课程添加属性ID来解决此问题,但也无法取得很大进展。

据我所知,每次添加内容时,SQL都会自动生成Id,但它并没有发生。我做错了什么?

SQL

public class User
{
    //public long ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

public User AddNewUser(Register signedUser)
{
   using (MyDBEntities context = new MyDBEntities())
   {
       User newRegisteredUser = new User {FirstName = signedUser.FirstName, LastName = signedUser.LastName, BirthDate = signedUser.BirthDate, Email = signedUser.Email, UserName = signedUser.UserName, Password = signedUser.Password };
       context.Users.Add(newRegisteredUser);
       context.SaveChanges();
       return newUser;
   }
}

C#

{{1}}

2 个答案:

答案 0 :(得分:4)

您需要将其声明为IDENTITY列,如下所示:

create table Users (
ID bigint IDENTITY(1,1) not null primary key,
FirstName nvarchar(50) not null,
LastName nvarchar(50) not null,
BirthDate smalldatetime not null,
Email varchar(50) not null,
UserName nvarchar(50) not null,
Password nvarchar(50) not null
)

答案 1 :(得分:2)

您需要执行以下操作:

  1. 将表中的主键列ID标记为IDENTITY,这将确保Sql Server将设置每条记录中列的值。
  2. 确保您还在模型的代码中定义了ID,并将其标记为主键。实体框架(EF)需要具有主键,以便区分记录。一旦使用EF开始对数据库执行查询,这一点很重要。
  3. 使用DatabaseGeneratedOption.Identity标记属性,以便不会使用Insert将值发送到数据库并且在插入完成后,将回读Sql Server添加的值并将其应用于模型。您可以使用任何属性或流利的表示法来执行此操作。
  4. 脚本:

    CREATE TABLE Users (
        ID bigint IDENTITY(1,1) NOT NULL PRIMARY KEY,
        FirstName nvarchar(50) not null,
        LastName nvarchar(50) not null,
        BirthDate smalldatetime not null,
        Email varchar(50) not null,
        UserName nvarchar(50) not null,
        Password nvarchar(50) not null
    )
    

    EF模型:

    public class User
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime BirthDate { get; set; }
        public string Email { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    

    旁注

    1. 您可以将int用于您的Id列,除非您正在设计一个全世界人口都将使用的系统。*
    2. 很难从您的代码中判断出来,但您可能会以纯文本形式保留用户选择的密码。 如果,则需要更改此代码,以便存储所选密码的安全哈希值(使用pbkdf2或bcrypt或scrypt )。切勿将用户密码以纯文本形式存储,甚至不使用可逆加密算法,这些都被视为不安全。