Code First 数据库主键

DatabaseGeneratedOption的含义

Identity:自增长

None:不处理

Computed:表示这一列是计算列。

在EF中,如果主键是int类型,Code First生成数据库的时候会自动设置该列为自增长。但如果主键是Guid类型,我们就要手动的去设置了。

对于下面的模型,如果我们没有设置自增长,数据库中会以0来填充

 

 public class Person

    {

        [Key]

        public Guid SocialSecurityNumber { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

 

 

            var person = new Person

            {

                FirstName = "Rowan",

                LastName = "Miller",

            };

            using (var context = new BreakAwayContext())

            {

                context.People.Add(person);

                context.SaveChanges();

            }

 

 

插入第二条记录的时候就会报错了。所以,下面的模型设置才是正确的。

 

 public class Person

    {

        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        public Guid SocialSecurityNumber { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

 

现在我们来看看有些情况配置为None也是有用的。修改一下上面的模型。

 

public class Person

    {

        [Key]

        public int SocialSecurityNumber { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

 

我们再插入一条记录看看

 

   var person = new Person

            {

                FirstName = "Rowan",

                LastName = "Miller",

                SocialSecurityNumber = 12345678

            };

 

            using (var context = new BreakAwayContext())

            {

                context.People.Add(person);

                context.SaveChanges();

            }

 

 

在数据库中存储的是1,并不是我们所想要的12345678.这是为什么呢?

因为主键是SocialSecurityNumber是Int类型,Code First在数据库中对该列作自增长处理。这时,我们想再插入自定义的SocialSecurityNumber就不行了。

所以当我们想这样做时,就应该把SocialSecurityNumber的自增长配置为None.

 

 public class Person

    {

        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

        public int SocialSecurityNumber { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

 

 如果对属性标识为Computed,EF会认为该列是通过其它列计算得出的,不会将其持久化到数据库中。

 

  public class Person

    {

        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

        public int SocialSecurityNumber { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

        public string Name { get; set; }

    }

 

 

var person = new Person

            {

                FirstName = "Rowan",

                LastName = "Miller",

                SocialSecurityNumber = 1231478,

                Name = "Rowan Miller",

            };

 

            using (var context = new BreakAwayContext())

            {

                context.People.Add(person);

                context.SaveChanges();

            }

 

查看数据库,我们看到Name并没有存储任何值。

 

 

必须手工修改数据库设计,设置默认值,方可起效。

 

  public class mail

    {

        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

        public int SocialSecurityNumber { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

        public DateTime CreatedOn { get; set; }

}

查看库结构,CreatedOn字段并没有指派默认值

修改库结构,设置默认值为getdate(),即当前日期

var person = new Person

            {

                SocialSecurityNumber = 1231478,

                CreatedOn =DateTime.Parse(“2000/1/1”);

            };

 

            using (var context = new BreakAwayContext())

            {

                context.People.Add(person);

                context.SaveChanges();

            }

最终写入数据库中的并不是制定的2000/1/1,而是系统当前时间

 

posted @ 2021-02-02 15:13  清语堂  阅读(401)  评论(0编辑  收藏  举报