2010-04-05 10 views
5

Tôi đang sử dụng EF4 và tạo các lớp thông qua bề mặt thiết kế Entity sau đó tạo cơ sở dữ liệu từ chúng. Tôi muốn thêm một thuộc tính vào một số lớp để hiển thị dấu thời gian chúng được cập nhật lần cuối.Làm cách nào để thêm thuộc tính RowVersion vào lớp EF4

Tôi đã thêm thuộc tính Phiên bản vào chúng, nhưng tôi không biết loại dữ liệu .Net nào liên kết với chúng để chúng trở thành Dấu thời gian hoặc Hàng hóa trong cơ sở dữ liệu khi được tạo.

Bất kỳ ý tưởng nào?

+0

Khi bạn đi theo con đường khác (DB -> mô hình) loại là 'byte [] '(trong mã) và "Nhị phân" (trong EDMX). –

+0

@Craig - khi bạn tạo lại DB từ mô hình, cột dấu thời gian biến thành cột nhị phân và bạn mất hành vi mà tôi đang tìm kiếm. –

+0

Để rõ ràng, SQL Server 'TIMESTAMP' không phải là thời gian. Đó là những gì bạn muốn, hoặc bạn muốn có một thời gian? Tôi đã giả sử bạn muốn có một 'TIMESTAMP', đó thực sự là nhị phân. –

Trả lời

4

Bạn sử dụng byte[] kiểu cho rowversion/timestamp

Ví dụ sử dụng: http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html

Nếu bạn đang ở trong nhà thiết kế, chỉ cần gõ vào byte[] hoặc System.Byte[], tôi nghĩ rằng các loại lĩnh vực lựa chọn thả xuống trên thiết kế EF có thể gõ vào.

Với DDL này

create table Movie 
(
MovieId int identity(1,1) not null primary key, 
MovieName varchar(100) not null unique, 
MovieDescription varchar(100) not null unique, 
YearReleased int not null, 
Version rowversion -- rowversion and timestamp are alias of each other 
); 

Đây là lập bản đồ lớp:

public class Movie 
{ 
    [Key] 
    public virtual int MovieId { get; set; } 
      
    [   Required, Display(Name="Title") 
    ]   public virtual string MovieName { get; set; } 
      
    [   Required, Display(Name="Description") 
    ]   public virtual string MovieDescription { get; set; } 
      
    [   Required, Display(Name="Year Released"), Range(1900,9999) 
    ]   public virtual int? YearReleased { get; set; } 
      
    [Timestamp] 
    // byte[] is the rowversion/timestamp .NET type 
    public virtual byte[] Version { get; set; } 
  
      
    public virtual IList<Genre> Genres { get; set; }              
} 
+2

uh oh .., tôi trả lời câu hỏi của năm ngoái: D –

3

Theo như tôi biết, rowversion là một giá trị nhị phân tương đối, không phải là giá trị thời gian thực. Nó tăng cho mỗi chèn và cập nhật xảy ra. Điều này cho phép bạn so sánh các giá trị để xác định bản ghi nào mới hơn. Vì nó là tương đối, được đưa ra một giá trị chuyển đổi hàng duy nhất, bạn sẽ không biết gì cả, nhưng với hai giá trị hàng tuần, bạn sẽ biết cái nào cũ hơn và mới hơn, nhưng không biết bao nhiêu.

Tôi không biết loại dữ liệu .Net nào liên kết với chúng để chúng trở thành Dấu thời gian hoặc RowVersion trong cơ sở dữ liệu khi được tạo.

Tôi không chắc chắn, nhưng nhiều khả năng không có kiểu dữ liệu nào cung cấp cho bạn hàng lỗi khi chuyển từ mô hình sang cơ sở dữ liệu. Bạn sẽ phải tự thay đổi loại trường cơ sở dữ liệu hoặc thêm trường vào DB và mang bản ghi lên đến mô hình của bạn. Bạn cũng có thể tạo DDL và sau đó sửa đổi nó trước khi tạo DB với nó.

Ngoài ra còn có một phương pháp khác để bạn có thể mở rộng chức năng của quy trình EF bằng cách bắt nguồn từ các lớp của nó. Sau đó bạn có thể tự mình chọn, nhưng tôi không quá quen thuộc với cách làm điều đó.