Entity Framework 數據生成選項DatabaseGenerated


在EF中,我們建立數據模型的時候,可以給屬性配置數據生成選項DatabaseGenerated,它后有三個枚舉值:Identity、None和Computed。

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並沒有存儲任何值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM