EF6 और EF-core दोनों में, Sql सर्वर के साथ काम करते समय, आपको इस मैपिंग का उपयोग करना होगा:
modelBuilder.Entity<Product>()
.Property(t => t.RowVersion)
.IsRowVersion(); // Not: IsConcurrencyToken
IsConcurrencyToken किसी संपत्ति को समवर्ती टोकन के रूप में कॉन्फ़िगर करता है, लेकिन (इसे byte[]
. के लिए उपयोग करते समय) संपत्ति)
- डेटा प्रकार
varbinary(max)
है - इसका मान हमेशा
null
होता है अगर आप इसे इनिशियलाइज़ नहीं करते हैं - रिकॉर्ड अपडेट होने पर इसका मान अपने आप नहीं बढ़ता है।
IsRowVersion दूसरी ओर,
- डेटाटाइप है
rowversion
(एसक्यूएल सर्वर में, याtimestamp
पुराने संस्करणों में), इसलिए - इसका मान कभी भी शून्य नहीं होता, और
- रिकॉर्ड अपडेट होने पर इसका मान हमेशा अपने आप बढ़ जाता है।
- और यह स्वचालित रूप से संपत्ति को एक आशावादी समवर्ती टोकन के रूप में कॉन्फ़िगर करता है।
अब जब आप एक Car
को अपडेट करते हैं आपको दो अपडेट स्टेटमेंट दिखाई देंगे:
DECLARE @p int
UPDATE [dbo].[Product]
SET @p = 0
WHERE (([Id] = @0) AND ([Rowversion] = @1))
SELECT [Rowversion]
FROM [dbo].[Product]
WHERE @@ROWCOUNT > 0 AND [Id] = @0
UPDATE [dbo].[Car]
SET ...
पहला स्टेटमेंट कुछ भी अपडेट नहीं करता है, लेकिन यह रोववर्सन को बढ़ाता है, और अगर बीच-बीच में रोववर्सन को बदल दिया गया तो यह एक समवर्ती अपवाद को फेंक देगा।
[System.ComponentModel.DataAnnotations.Schema.Timestamp]
विशेषता IsRowVersion()
. के समतुल्य डेटा एनोटेशन है :
[Timestamp]
public byte[] RowVersion { get; set; }