生成的属性

在这文章中:

   生成属性

     值生成模式

        没有值生成

        添加值生成的值

        添加或更新值生成的值

     公约

     数据注解

        没有值生成

        添加值生成的值

        添加或更新值生成的值

     Fluent API

        没有值生成

        添加值生成的值

        添加或更新值生成的值

 

 

值生成模式

 

有三个值生成模式,可用于属性

 

没有值生成

  

没有值生成意味着您将始终提供一个保存到数据库的有效值。此有效值必须在添加到上下文之前将其分配给新的实体。

 

 

添加值生成的值

 

添加值生成值意味着新的实体生成一个值

 

警示

    如何为添加的实体生成值将取决于正在使用的数据库提供程序。数据库提供程序可以为某些属性类型自动设置值生成,但其他的可能需要您手动设置值是如何生成的。 

 

例如,当使用SQL Server,将自动为GUID属性生成值(使用SQL Server顺序GUID算法)。然而,如果你指定添加生成一个DateTime属性,然后你必须设置一个值生成的方式(诸如设置默认的SQL的getDate()的值,看Default Values)。

 

 

 

 

如果你添加一个实体到具有分配给主键属性值的上下文中,然后EF将试图添加值而不是生成一个新的值。一个属性被认为是有价值的分配,如果没有指定CLR默认值(string的null,int的0,Guid的Guid.Empty等等)

 

取决正被使用的数据库提供程序,值也许会被生成客户端通过EF或者在数据库里,如果由数据库生成的值,那么当您将实体添加到上下文中时,EF则可以为其分配一个临时值。这个临时的值将被数据库生成的值所替换在执行SaveChanges期间

 

 

添加或更新值生成的值

 

添加或更新值生成的值意味着记录保存每次都会生成一个新值(添加或更新)

 

警示

 

如何为添加或更新的实体生成值将取决于正在使用的数据库提供程序。数据库提供程序可以为某些属性类型自动设置值生成,但其他的可能需要您手动设置值是如何生成的。

 

例如当使用SQL Server时, 添加或更新生成的byte[]属性并标记为并发标记,将用时间戳记设置数据类型。-以便值将被生成在数据库中。然而,如果你指定添加或更新一个生成的DateTime属性,然后,您必须设置一个用于生成的值的方法(诸如一个数据库触发器)

 

 

像“添加值生成的值”,如果为实体的一个新添加的实例指定了属性的值,则该属性将被插入而不是生成的值。此外,如果您显式更改分配给属性的值(因此将其标记为修改),那么新的值将被设置在数据库中,而不是一个正在生成的值。

 

 

 

公约

 

按照惯例,Int或者GUID类型的主键将被设置成有添加值生成的值,所有其他的属性设置为没有值生成。

 

数据注解

 

没有值生成

 

public class Blog

    {

        [DatabaseGenerated(DatabaseGeneratedOption.None)]

        public int BlogId { get; set; }

        public string Url { get; set; }

    }

 

添加值生成的值

 

public class Blog

    {

        public int BlogId { get; set; }

        public string Url { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        public DateTime Inserted { get; set; }

    }

警示

 

这只是让EF知道,值是为添加实体生成的,它并不能保证EF有效地设置实际的机制来生成值。看Value generated on add部分的更多细节。

 

添加或更新值生成的值

 

public class Blog

    {

        public int BlogId { get; set; }

        public string Url { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

        public DateTime LastUpdated { get; set; }

    }

警示:

 

这只是让EF知道,值是为添加或更新实体生成的,它并不能保证EF有效地设置实际的机制来生成值。看Value generated on add or update部分关于更多的细节。

 

 

 

Fluent API

 

你能使用Fluent API来改变一个给定的属性的值生成模式。

 

没有值生成

 

class MyContext : DbContext

    {

        public DbSet<Blog> Blogs { get; set; }

 

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Blog>()

                .Property(b => b.BlogId)

                .ValueGeneratedNever();

        }

    }

 

    public class Blog

    {

        public int BlogId { get; set; }

        public string Url { get; set; }

    }

 

 

添加值生成的值

 

 class MyContext : DbContext

    {

        public DbSet<Blog> Blogs { get; set; }

 

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Blog>()

                .Property(b => b.Inserted)

                .ValueGeneratedOnAdd();

        }

    }

 

    public class Blog

    {

        public int BlogId { get; set; }

        public string Url { get; set; }

        public DateTime Inserted { get; set; }

    }

 

警示:

这只是让EF知道,值是为添加实体生成的,它并不能保证EF有效地设置实际的机制来生成值。看Value generated on add部分的更多细节。

 

 

值生成来添加或更新实体

 

  class MyContext : DbContext

    {

        public DbSet<Blog> Blogs { get; set; }

 

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            modelBuilder.Entity<Blog>()

                .Property(b => b.LastUpdated)

                .ValueGeneratedOnAddOrUpdate();

        }

    }

 

    public class Blog

    {

        public int BlogId { get; set; }

        public string Url { get; set; }

        public DateTime LastUpdated { get; set; }

    }

 

警示:

 

这只是让EF知道,值是为添加或更新实体生成的,它并不能保证EF有效地设置实际的机制来生成值。看Value generated on add or update部分关于更多的细节。

posted on 2016-11-02 21:20  凯胜  阅读(508)  评论(0)    收藏  举报