Generowane wartościGenerated Values

Wzorce Generowanie wartościValue Generation Patterns

Istnieją trzy wzorce Generowanie wartości, które mogą być używane dla właściwości:There are three value generation patterns that can be used for properties:

  • Generowanie wartości nie jestNo value generation
  • Dodaj wartość wygenerowanoValue generated on add
  • Wartość wygenerowaną na dodawanie lub aktualizowanieValue generated on add or update

Generowanie wartości nie jestNo value generation

Generowanie wartość nie oznacza, że zawsze będzie podać prawidłową wartość do zapisania w bazie danych.No value generation means that you will always supply a valid value to be saved to the database. To prawidłową wartość można przypisać nowe jednostki, zanim zostaną one dodane do kontekstu.This valid value must be assigned to new entities before they are added to the context.

Dodaj wartość wygenerowanoValue generated on add

Wartość wygenerowano Dodaj oznacza, że wygenerowaną wartość dla nowych jednostek.Value generated on add means that a value is generated for new entities.

W zależności od używanego dostawcy bazy danych wartości mogą być generowane po stronie klienta lub w bazie danych EF.Depending on the database provider being used, values may be generated client side by EF or in the database. Jeśli wartość jest generowana przez bazę danych, następnie EF może przypisać wartości tymczasowej po dodaniu elementu do kontekstu.If the value is generated by the database, then EF may assign a temporary value when you add the entity to the context. Tej wartości tymczasowej następnie zostanie zastąpiona przez wartości bazy danych, wygenerowane podczas SaveChanges().This temporary value will then be replaced by the database generated value during SaveChanges().

Jeśli dodasz jednostki do kontekstu, który ma wartość przypisana do właściwości EF będzie podejmować próby Wstaw tę wartość, zamiast generować nową.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. Właściwość została uznana za wartości przypisanej, jeśli nie jest przypisana wartość domyślna CLR (null dla string, 0 dla int, Guid.Empty dla Guiditp.).A 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.). Aby uzyskać więcej informacji, zobacz jawne wartości dla wygenerowanych właściwości.For more information, see Explicit values for generated properties.

Ostrzeżenie

Jak wartość jest generowana dla jednostek dodano będzie zależeć od używanego dostawcy bazy danych.How the value is generated for added entities will depend on the database provider being used. Dostawcy baz danych może automatycznie skonfigurować Generowanie wartości dla niektórych typów właściwości, ale innych może być konieczne, należy ręcznie skonfigurować, jak jest generowany wartość.Database providers may automatically setup value generation for some property types, but others may require you to manually setup how the value is generated.

Na przykład podczas korzystania z programu SQL Server, wartości będą automatycznie generowane dla GUID właściwości (przy użyciu programu SQL Server algorytm sekwencyjny identyfikatora GUID).For example, when using SQL Server, values will be automatically generated for GUID properties (using the SQL Server sequential GUID algorithm). Jednak jeśli określono DateTime właściwość jest generowany na dodać, a następnie należy skonfigurować sposób wartości do wygenerowania.However, if you specify that a DateTime property is generated on add, then you must setup a way for the values to be generated. Jednym ze sposobów, aby to zrobić, to aby skonfigurować domyślną wartość GETDATE(), zobacz wartości domyślne.One way to do this, is to configure a default value of GETDATE(), see Default Values.

Wartość wygenerowaną na dodawanie lub aktualizowanieValue generated on add or update

Wartość generowane przy dodawaniu lub aktualizacja oznacza, że nowa wartość jest generowany za każdym razem, gdy rekord zostanie zapisany (insert nebo update).Value generated on add or update means that a new value is generated every time the record is saved (insert or update).

Podobnie jak value generated on add, jeśli określona wartość właściwości na nowo dodane wystąpienie jednostki, że wartość zostanie wstawiony zamiast wartości generowanych.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. Jest również możliwość określenia jawną wartość podczas aktualizacji.It is also possible to set an explicit value when updating. Aby uzyskać więcej informacji, zobacz jawne wartości dla wygenerowanych właściwości.For more information, see Explicit values for generated properties.

Ostrzeżenie

Jak wartość jest generowana dla dodanych i zaktualizowanych jednostek będzie zależeć od używanego dostawcy bazy danych.How the value is generated for added and updated entities will depend on the database provider being used. Dostawcy baz danych może automatycznie skonfigurować Generowanie wartości dla niektórych typów właściwości, podczas gdy inne będą wymagają ręcznego konfigurowania, jak jest generowany wartość.Database providers may automatically setup value generation for some property types, while others will require you to manually setup how the value is generated.

Na przykład w przypadku korzystania z programu SQL Server byte[] właściwości, które są ustawione, tak jak w dodać lub zaktualizować i oznaczone jako tokeny współbieżności będzie instalacji z użyciem rowversion typ danych — tak, aby wartości, zostanie wygenerowany w bazie danych.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. Jednak jeśli określono DateTime właściwość jest generowany na dodać lub zaktualizować, a następnie należy skonfigurować sposób wartości do wygenerowania.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. Jednym ze sposobów, aby to zrobić, to aby skonfigurować domyślną wartość GETDATE() (zobacz wartości domyślne) do generowania wartości dla nowych wierszy.One way to do this, is to configure a default value of GETDATE() (see Default Values) to generate values for new rows. Następnie można użyć wyzwalacza bazy danych do generowania wartości podczas aktualizacji (na przykład następujący wyzwalacz przykład).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

KonwencjeConventions

Zgodnie z Konwencją kluczy podstawowych innych niż złożone typu short, int, long lub identyfikator Guid będzie instalacji mogą mieć wartości wygenerowano Dodaj.By convention, non-composite primary keys of type short, int, long, or Guid will be setup to have values generated on add. Wszystkie pozostałe właściwości będzie Instalatora z Generowanie nie wartość.All other properties will be setup with no value generation.

Adnotacje danychData Annotations

Generowanie nie wartość (adnotacje danych)No value generation (Data Annotations)

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

Wartość wygenerowano Dodaj (adnotacje danych)Value generated on add (Data Annotations)

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

Ostrzeżenie

Dzięki temu wystarczy wiedzieć, że wartości są generowane dla jednostek dodano, nie gwarantuje, że EF skonfiguruje konkretny mechanizm do generowania wartości EF.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. Zobacz Dodaj wartość wygenerowano sekcji, aby uzyskać więcej informacji.See Value generated on add section for more details.

Dodaj wartość wygenerowano lub aktualizacji (adnotacje danych)Value generated on add or update (Data Annotations)

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

Ostrzeżenie

Dzięki temu wystarczy wiedzieć, że wartości są generowane dla jednostek dodane lub zaktualizowane, nie gwarantuje, że EF skonfiguruje konkretny mechanizm do generowania wartości EF.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. Zobacz wartość wygenerowano dodania lub zaktualizowania sekcji, aby uzyskać więcej informacji.See Value generated on add or update section for more details.

Interfejs Fluent APIFluent API

Interfejs Fluent API umożliwia zmienianie wzorca Generowanie wartości danej właściwości.You can use the Fluent API to change the value generation pattern for a given property.

Generowanie nie wartość (Fluent API)No value generation (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.BlogId)
    .ValueGeneratedNever();

Wartość wygenerowano Dodaj (Fluent API)Value generated on add (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.Inserted)
    .ValueGeneratedOnAdd();

Ostrzeżenie

ValueGeneratedOnAdd() po prostu umożliwia EF wiedzieć, że wartości są generowane dla jednostek dodano, nie gwarantuje, że EF skonfiguruje konkretny mechanizm do generowania wartości.ValueGeneratedOnAdd() 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. Zobacz Dodaj wartość wygenerowano sekcji, aby uzyskać więcej informacji.See Value generated on add section for more details.

Dodaj wartość wygenerowano lub aktualizacji (Fluent API)Value generated on add or update (Fluent API)

modelBuilder.Entity<Blog>()
    .Property(b => b.LastUpdated)
    .ValueGeneratedOnAddOrUpdate();

Ostrzeżenie

Dzięki temu wystarczy wiedzieć, że wartości są generowane dla jednostek dodane lub zaktualizowane, nie gwarantuje, że EF skonfiguruje konkretny mechanizm do generowania wartości EF.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. Zobacz wartość wygenerowano dodania lub zaktualizowania sekcji, aby uzyskać więcej informacji.See Value generated on add or update section for more details.