بررسی [Timestamp] در Entity Framework Code First


یکی دیگر از attribute هایی که در Entity Framework به منظور پیکربندی convention های پیش فرض استفاده می شود [Timestamp] نام دارد. این attribute می‌تواند در هر entity class فقط یک بار مورد استفاده قرار بگیرد. ضمناً property مورد نظر که قرار است این attribute بر روی آن لحاظ بشود، حتماً باید آرایه‌ای از نوع داده ای byte باشد. این attribute یک ستون از نوع داده ای timestamp را در دیتابیس ایجاد خواهد کرد. Entity Framework API به صورت پیش فرض از این ستون به منظور چک کردن موارد مربوط به هم روندی و یا concurrency در جملات UPDATE استفاده خواهد کرد. کدی که در قسمت زیر مشاهده می کنید مثالی از استفاده کردن از این attribute را نشان می‌دهد.

using System.ComponentModel.DataAnnotations;

public class Student

{

public int StudentId { get; set; }

public string StudentName { get; set; }

[Timestamp]

public byte[] RowVersion { get; set; }

}

در مثال بالا از [Timestamp] بر روی یک property از کلاس Student استفاده کرده‌ایم. نام این پروپرتی RowVersion می باشد و نوع داده ای آن []byte است. این باعث می شود که Entity Framework یک ستون به نام RowVersion از نوع داده ای timestamp را در جدول Students از دیتابیس ایجاد کند. این موضوع در تصویر زیر نشان داده شده است.


ستون timestamp در دستورات WHERE در زمان به روز رسانی کردن یک entity و صدا زدن متد SaveChanges لحاظ خواهد شد. کد زیر این موضوع را نشان می دهد.

using(var context = new SchoolContext())

{

var std = new Student()

{

StudentName = "Bill"

};

context.Students.Add(std);

context.SaveChanges();

std.StudentName = "Steve";

context.SaveChanges();

}

لطفاً دقت کنید که جمله UPDATE متناظر با این دستور که به سمت دیتابیس اجرا خواهد شد شبیه به کد زیر خواهد بود.

exec sp_executesql N'UPDATE [dbo].[Students]

SET [StudentName] = @0

WHERE (([StudentId] = @1) AND ([RowVersion] = @2))

SELECT [RowVersion]

FROM [dbo].[Students]

WHERE @@ROWCOUNT > 0 AND [StudentId] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8)',@0=N'Steve',@1=1,@2=0x00000000000007D1

go

همانطور که می‌بینید در قسمت WHERE از RowVersion استفاده شده است.

منبع:وبسایت پرووید