Oluşturulan DeğerlerGenerated Values

Değer oluşturma desenleriValue generation patterns

Özellikler için kullanılabilecek üç değer oluşturma deseni vardır:There are three value generation patterns that can be used for properties:

  • Değer oluşturma yokNo value generation
  • Ekleme sırasında oluşturulan değerValue generated on add
  • Ekleme veya güncelleştirme üzerinde oluşturulan değerValue generated on add or update

Değer oluşturma yokNo value generation

Değer oluşturma, her zaman veritabanına kaydedilecek geçerli bir değer sağlayacaksınız anlamına gelir.No value generation means that you will always supply a valid value to be saved to the database. Bu geçerli değer, içeriğe eklenmeden önce yeni varlıklara atanmalıdır.This valid value must be assigned to new entities before they are added to the context.

Ekleme sırasında oluşturulan değerValue generated on add

Ekleme sırasında oluşturulan değer, yeni varlıklar için bir değerin oluşturulduğu anlamına gelir.Value generated on add means that a value is generated for new entities.

Kullanılan veritabanı sağlayıcısına bağlı olarak, değerler istemci tarafında EF veya veritabanında oluşturulabilir.Depending on the database provider being used, values may be generated client side by EF or in the database. Değer veritabanı tarafından oluşturulduysa, varlığı bağlama eklediğinizde EF geçici bir değer atayabilir.If the value is generated by the database, then EF may assign a temporary value when you add the entity to the context. Bu geçici değer, SaveChanges()sırasında veritabanı tarafından oluşturulan değerle değiştirilmelidir.This temporary value will then be replaced by the database generated value during SaveChanges().

Özelliğe atanmış bir değere sahip bir varlık eklerseniz, EF yeni bir değer oluşturmak yerine bu değeri eklemeye çalışacaktır.If you add an entity to the context that has a value assigned to the property, then EF will attempt to insert that value rather than generating a new one. Bir özellik, CLR varsayılan değeri (stringiçinnull, intiçin 0 Guid.Empty, vb.) atanmadığı takdirde atanan bir değere sahip olarak kabul edilir.GuidA property is considered to have a value assigned if it is not assigned the CLR default value (null for string, 0 for int, Guid.Empty for Guid, etc.). Daha fazla bilgi için bkz. oluşturulan Özellikler Için açık değerler.For more information, see Explicit values for generated properties.

Uyarı

Eklenen varlıklar için değerin nasıl oluşturulduğu, kullanılmakta olan veritabanı sağlayıcısına bağlıdır.How the value is generated for added entities will depend on the database provider being used. Veritabanı sağlayıcıları bazı özellik türleri için değer oluşturmayı otomatik olarak oluşturabilir, ancak diğerleri değerin nasıl oluşturulduğunu el ile ayarlamanıza gerek olabilir.Database providers may automatically setup value generation for some property types, but others may require you to manually setup how the value is generated.

Örneğin, SQL Server kullanırken, GUID özellikler için değerler otomatik olarak oluşturulur (SQL Server sıralı GUID algoritması kullanılarak).For example, when using SQL Server, values will be automatically generated for GUID properties (using the SQL Server sequential GUID algorithm). Ancak, ekleme sırasında bir DateTime özelliğinin oluşturulduğunu belirtirseniz, değerlerin oluşturulması için bir yol oluşturmanız gerekir.However, if you specify that a DateTime property is generated on add, then you must setup a way for the values to be generated. Bunu yapmanın bir yolu, GETDATE()varsayılan değerini yapılandırmak için varsayılan değerlerbölümüne bakın.One way to do this, is to configure a default value of GETDATE(), see Default Values.

Ekleme veya güncelleştirme üzerinde oluşturulan değerValue generated on add or update

Ekleme veya güncelleştirme üzerinde oluşturulan değer, kayıt her kaydedildiğinde (ekleme veya güncelleştirme) yeni bir değerin oluşturulduğu anlamına gelir.Value generated on add or update means that a new value is generated every time the record is saved (insert or update).

value generated on addgibi, bir varlığın yeni eklenen örneğinde özellik için bir değer belirtirseniz, bu değer, üretilmekte olan bir değer yerine eklenir.Like value generated on add, if you specify a value for the property on a newly added instance of an entity, that value will be inserted rather than a value being generated. Güncelleştirme sırasında açık bir değer ayarlamak da mümkündür.It is also possible to set an explicit value when updating. Daha fazla bilgi için bkz. oluşturulan Özellikler Için açık değerler.For more information, see Explicit values for generated properties.

Uyarı

Değerin eklenen ve güncelleştirilmiş varlıkların nasıl oluşturulduğu, kullanılmakta olan veritabanı sağlayıcısına bağlıdır.How the value is generated for added and updated entities will depend on the database provider being used. Veritabanı sağlayıcıları bazı özellik türleri için değer oluşturmayı otomatik olarak oluşturabilir, diğerleri ise değerin nasıl oluşturulduğunu el ile ayarlamanıza gerek duyar.Database providers may automatically setup value generation for some property types, while others will require you to manually setup how the value is generated.

Örneğin, SQL Server kullanırken, ekleme veya güncelleştirme sırasında oluşturulan ve eşzamanlılık belirteçleri olarak işaretlenen byte[] özellikler, rowversion veri türüyle ayarlanır. böylece değerler veritabanında oluşturulur.For example, when using SQL Server, byte[] properties that are set as generated on add or update and marked as concurrency tokens, will be setup with the rowversion data type - so that values will be generated in the database. Ancak, ekleme veya güncelleştirme üzerinde bir DateTime özelliğinin oluşturulduğunu belirtirseniz, değerlerin oluşturulması için bir yol oluşturmanız gerekir.However, if you specify that a DateTime property is generated on add or update, then you must setup a way for the values to be generated. Bunu yapmanın bir yolu, yeni satırların değerlerini oluşturmak için GETDATE() varsayılan değerini (bkz. varsayılan değerler) yapılandırmak içindir.One way to do this, is to configure a default value of GETDATE() (see Default Values) to generate values for new rows. Daha sonra güncelleştirmeler sırasında değerler oluşturmak için bir veritabanı tetikleyicisi kullanabilirsiniz (örneğin, aşağıdaki örnek tetikleyici).You could then use a database trigger to generate values during updates (such as the following example trigger).

CREATE TRIGGER [dbo].[Blogs_UPDATE] ON [dbo].[Blogs]
    AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
                  
    IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN;
    
    DECLARE @Id INT
        
    SELECT @Id = INSERTED.BlogId
    FROM INSERTED
          
    UPDATE dbo.Blogs
    SET LastUpdated = GETDATE()
    WHERE BlogId = @Id
END

Ekleme sırasında oluşturulan değerValue generated on add

Kural gereği, uygulama tarafından bir değer sağlanmadıysa, anahtar, int, Long veya GUID türündeki bileşik olmayan birincil anahtarlar, eklenen varlıklar için oluşturulan değerlere sahip olacak şekilde ayarlanır.By convention, non-composite primary keys of type short, int, long, or Guid are set up to have values generated for inserted entities, if a value isn't provided by the application. Veritabanı sağlayıcınız genellikle gereken yapılandırmayı üstlenir; Örneğin, SQL Server bir sayısal birincil anahtar otomatik olarak bir KIMLIK sütunu olarak ayarlanır.Your database provider typically takes care of the necessary configuration; for example, a numeric primary key in SQL Server is automatically set up to be an IDENTITY column.

Herhangi bir özelliği, ekli varlıklar için değeri oluşturulacak şekilde aşağıdaki gibi yapılandırabilirsiniz:You can configure any property to have its value generated for inserted entities as follows:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Inserted { get; set; }
}

Uyarı

Bu yalnızca AŞV 'nin eklenen varlıklar için değerlerin oluşturulduğunu bilmesini sağlar. Bu, EF 'in değer oluşturmak için gerçek mekanizmayı ayarlayabileceklerini garanti etmez.This just lets EF know that values are generated for added entities, it does not guarantee that EF will setup the actual mechanism to generate values. Daha fazla ayrıntı için bkz. ekleme bölümünde oluşturulan değer .See Value generated on add section for more details.

Varsayılan değerlerDefault values

İlişkisel veritabanlarında, bir sütun varsayılan bir değerle yapılandırılabilir; bir satır bu sütun için bir değer olmadan eklenirse, varsayılan değer kullanılacaktır.On relational databases, a column can be configured with a default value; if a row is inserted without a value for that column, the default value will be used.

Bir özellik üzerinde varsayılan bir değer yapılandırabilirsiniz:You can configure a default value on a property:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Rating)
        .HasDefaultValue(3);
}

Varsayılan değeri hesaplamak için kullanılan bir SQL parçası da belirtebilirsiniz:You can also specify a SQL fragment that is used to calculate the default value:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Created)
        .HasDefaultValueSql("getdate()");
}

Varsayılan bir değer belirtmek, özelliği, ekleme sırasında oluşturulan değer olarak örtülü olarak yapılandırır.Specifying a default value will implicitly configure the property as value generated on add.

Ekleme veya güncelleştirme üzerinde oluşturulan değerValue generated on add or update

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastUpdated { get; set; }
}

Uyarı

Bu yalnızca AŞV 'nin eklenen veya güncelleştirilmiş varlıklar için değerlerin oluşturulduğunu bilmesini sağlar. Bu, EF 'in, değer oluşturmak için gerçek mekanizmayı ayarlayabileceklerini garanti etmez.This just lets EF know that values are generated for added or updated entities, it does not guarantee that EF will setup the actual mechanism to generate values. Daha fazla ayrıntı için bkz. ekleme veya güncelleştirme üzerinde oluşturulan değer .See Value generated on add or update section for more details.

Hesaplanan sütunlarComputed columns

Bazı ilişkisel veritabanlarında, bir sütun değeri, genellikle diğer sütunlara başvuran bir ifadeyle birlikte veritabanında hesaplanmalıdır:On some relational databases, a column can be configured to have its value computed in the database, typically with an expression referring to other columns:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.DisplayName)
        .HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
}

Not

Bazı durumlarda, sütunun değeri her getirilirken (bazen sanal sütunlar olarak adlandırılır) hesaplanır ve diğer bir deyişle, satırdaki her güncelleştirmede ve depolanan (bazen depolanan veya kalıcı sütunlar olarak adlandırılır) hesaplanır.In some cases the column's value is computed every time it is fetched (sometimes called virtual columns), and in others it is computed on every update of the row and stored (sometimes called stored or persisted columns). Bu, veritabanı sağlayıcılarının tamamında farklılık gösterir.This varies across database providers.

Değer oluşturma yokNo value generation

Bir özellik üzerinde değer oluşturmayı devre dışı bırakmak genellikle bir kural değer oluşturma için yapılandırıyorsa gereklidir.Disabling value generation on a property is typically necessary if a convention configures it for value generation. Örneğin, int türünde bir birincil anahtarınız varsa, bu, ekleme sırasında oluşturulan değer olarak örtülü olarak ayarlanır; Bunu aşağıdakiler aracılığıyla devre dışı bırakabilirsiniz:For example, if you have a primary key of type int, it will be implicitly set configured as value generated on add; you can disable this via the following:

public class Blog
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int BlogId { get; set; }
    public string Url { get; set; }
}