Oluşturulan Değerler
Veritabanı sütunlarının değerleri çeşitli yollarla oluşturulmuş olabilir: birincil anahtar sütunları genellikle otomatik olarak artıran tamsayılar, diğer sütunlarda varsayılan veya hesaplanan değerler vb. bulunur. Bu sayfada, yapılandırma değeri oluşturma ile ilgili çeşitli desenler ve EF Core.
Varsayılan değerler
İlişkisel veritabanlarında bir sütun varsayılan değerle yalıtabilirsiniz; Bu sütun için değer olmadan bir satır eklenirse varsayılan değer kullanılır.
Bir özellikte varsayılan değer yapılandırabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
}
Varsayılan değeri hesaplamak SQL bir parça da belirtsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()");
}
Hesaplanan sütunlar
Çoğu ilişkisel veritabanında, bir sütun değeri veritabanında hesaplandı olacak şekilde ya da genellikle diğer sütunlara başvuran bir ifadeyle yalıtabilirsiniz:
modelBuilder.Entity<Person>()
.Property(p => p.DisplayName)
.HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
Yukarıdaki sütun, değeri veritabanından her getirilse hesaplanan sanal bir sütun oluşturur. Ayrıca, hesaplanan bir sütunun depolandır(bazen kalıcı olarak da adlandırılan) belirtebilirsiniz; başka bir ifade, satırın her güncelleştirmesinde hesaplandığı ve normal sütunların yanı sıra diskte depolandığı anlamına gelir:
modelBuilder.Entity<Person>()
.Property(p => p.NameLength)
.HasComputedColumnSql("LEN([LastName]) + LEN([FirstName])", stored: true);
Not
5.0'da depolanmış EF Core oluşturma desteği eklendi.
Birincil anahtarlar
Kural gereği, kısa, int, long veya Guid türünde bileşik olmayan birincil anahtarlar, uygulama tarafından bir değer sağlanamıyorsa eklenen varlıklar için değerler oluşturulacak şekilde ayarlanır. Veritabanı sağlayıcınız genellikle gerekli yapılandırmayla ilgilener; Örneğin, veri kümesinde sayısal SQL Server otomatik olarak IDENTITY sütunu olacak şekilde ayarlanır.
Daha fazla bilgi için anahtarlar ile ilgili belgelere bakın.
Değer oluşturmayı açıkça yapılandırma
Yukarıda, birincil EF Core için değer oluşturmanın otomatik olarak ayar olduğunu gördük, ancak aynı şeyi anahtar olmayan özellikler için de yapmak istiyor olabiliriz. Herhangi bir özelliği, eklenen varlıklar için değerinin oluşturularak aşağıdaki gibi yapılandırabilirsiniz:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Inserted { get; set; }
}
Benzer şekilde, özellik ekleme veya güncelleştirmede değerinin oluşturularak yalıtabilirsiniz:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }
}
Uyarı
Varsayılan değerlerden veya hesaplanan sütunlardan farklı olarak, değerlerin nasıl oluşturul olacağını belirtmeziz; bu, kullanılan veritabanı sağlayıcısına bağlıdır. Veritabanı sağlayıcıları bazı özellik türleri için değer oluşturma özelliğini otomatik olarak ayarlaysa da, diğerleri değerin nasıl oluşturulacaklarını el ile ayarlamanız gerekebilir.
Örneğin, SQL Server bir GUID özelliği eklemede oluşturulan değer olarak yapılandırıldığında sağlayıcı, en iyi sıralı GUID değerlerini oluşturmak için bir algoritma kullanarak otomatik olarak değer oluşturma istemci tarafı gerçekleştirir. Ancak, bir DateTime özelliğinde ValueGeneratedOnAdd değerini belirtmenin hiçbir etkisi olmaz ( DateTime değer oluşturma içinaşağıdaki bölüme bakın).
Benzer şekilde, ekleme veya güncelleştirme sırasında oluşturulmuş olarak yapılandırılan ve eşzamanlılık belirteçleri olarak işaretlenen byte[] özellikleri rowversion veri türüyle ayarlanır ve böylece veritabanında değerler otomatik olarak oluşturulur. Ancak ValueGeneratedOnAdd değerinin belirtici bir etkisi yoktur.
Not
Kullanılan veritabanı sağlayıcısına bağlı olarak, değerler EF tarafından veya veritabanında istemci tarafında oluşturulabilirsiniz. Değer veritabanı tarafından oluşturulursa, varlığı bağlama eklerken EF geçici bir değer atayabilirsiniz; Bu geçici değer daha sonra sırasında veritabanı tarafından oluşturulan değerle SaveChanges() değiştirilir. Daha fazla bilgi için geçici değerler belgelerine bakın.
Tarih/saat değeri oluşturma
Sık karşılaşılan bir istek, sütunun ilk eklenme tarihi/saati (eklemede oluşturulan değer) veya en son ne zaman güncelleştirilmiş olduğu (ekleme veya güncelleştirmede oluşturulan değer) içeren bir veritabanı sütununa sahip olmaktır. Bunu yapmak için çeşitli stratejiler olduğu EF Core sağlayıcılar genellikle tarih/saat sütunları için otomatik olarak değer oluşturmaz. Bunu kendiniz yapılandırmanız gerekir.
Oluşturma zaman damgası
Bir tarih/saat sütununu satırın oluşturma zaman damgasına sahip olacak şekilde yapılandırmak genellikle varsayılan değeri uygun SQL yapılandırmayla ilgili olur. Örneğin, SQL Server aşağıdakini kullanabilirsiniz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()");
}
Birden çok işlev (örn. ve ) mevcut olduğundan uygun işlevi seçmeyi GETDATE() emin GETUTCDATE() olun.
Güncelleştirme zaman damgası
Depolanan hesaplanan sütunlar, son güncelleştirilen zaman damgasını yönetmek için iyi bir çözüm gibi görünse de veritabanları genellikle hesaplanan sütunlarda olduğu gibi işlevlerin belirt olmasına GETDATE() izin vermez. Alternatif olarak, aynı etkiyi elde etmek için bir veritabanı tetikleyicisi de kurabilirsiniz:
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
Tetikleyici oluşturma hakkında bilgi için, geçişlerde ham veri SQL belgelerine bakın.
Değer oluşturmayı geçersiz kılma
Bir özellik değer oluşturma için yapılandırılmış olsa da, çoğu durumda yine de açıkça bir değer belirtesiniz. Bunun gerçekten çalışıp çalışmaymayacak, yapılandırılan belirli bir değer oluşturma mekanizmasına bağlıdır; bir sütunun varsayılan değerini kullanmak yerine açık bir değer belirtebilirsiniz, ancak aynı işlem hesaplanan sütunlarda da kullanılamaz.
Değer oluşturma özelliğini açık bir değerle geçersiz kılmak için, özelliğini ilgili özelliğin türü için CLR varsayılan değeri olmayan herhangi bir değere ( null için , için , , string0intGuid.EmptyGuid vb.) ayarlamanız gerekir.
Not
Identity kimliğine açık değerler SQL Server varsayılan olarak başarısız olur; Geçici bir çözüm için bu belgelere bakın.
Ekleme veya güncelleştirmede oluşturulan değer olarak yapılandırılmış özellikler için açık bir değer sağlamak için, özelliği de aşağıdaki gibi yapılandırmanız gerekir:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate()
.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save);
}
Değer oluşturma yok
Yukarıda açıklananlar gibi belirli senaryolar dışında, özellikler genellikle değer oluşturma yapılandırılmaz; Bu, uygulamaya her zaman veritabanına kaydedilebilir bir değer sağlamak anlamına gelir. Bu değer, bağlama eklenmeden önce yeni varlıklara atanmalı.
Ancak, bazı durumlarda kural tarafından ayarlanmış değer oluşturma özelliğini devre dışı bırakmak istiyor olabilir. Örneğin, int türünde bir birincil anahtar genellikle örtülü olarak value-generated-on-add olarak yapılandırılır (örneğin, SQL Server). Bunu devre dışı bırakmak için aşağıdaki adımları kullanabilirsiniz:
public class Blog
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int BlogId { get; set; }
public string Url { get; set; }
}