2011-08-18 29 views
16

Tôi đang sử dụng Entity Framework 4.1 Code Đầu tiên. Có cách nào để xây dựng một danh sách các thuộc tính đã thay đổi kể từ khi thực thể được nạp từ cơ sở dữ liệu không? Tôi biết mã đầu tiên phát hiện rằng một đối tượng đã được thay đổi, nhưng là có một cách để có được chính xác những gì tài sản đã thay đổi?EF 4.1 Code Đầu tiên - Xác định những thuộc tính đã thay đổi

Trả lời

28

Đối với tài sản vô hướng và phức tạp, bạn có thể sử dụng sau đây để trích xuất các tên thuộc tính thay đổi của một thực thể myEntity:

var entry = context.Entry(myEntity); 
var namesOfChangedProperties = entry.CurrentValues.PropertyNames 
    .Where(p => entry.Property(p).IsModified); 

Một số điều cần lưu ý ở đây:

  • CurrentValues.PropertyNames chỉ chứa vô hướng và các thuộc tính phức tạp, không phải thuộc tính điều hướng.

  • tính Complex có nghĩa là: Chỉ có tên của thuộc tính phức tạp được công bố trên thực thể, không phải là tài sản cá nhân thực tế của các loại phức tạp riêng của mình, ví dụ: Nếu bạn có mô hình này ...

    [ComplexType] 
    public class Address 
    { 
        public string Country { get; set; } 
        public string City { get; set; } 
    } 
    
    public class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public Address Address { get; set; } 
    } 
    

    ... sau đó, nếu myEntity là một Person, CurrentValues.PropertyNames sẽ chứa "Id", "Tên" và "Địa chỉ" nhưng không "Address.Country" hoặc "Address.City "(cũng không" Quốc gia "hoặc" Thành phố ").

  • Nếu một tài sản phức tạp được đánh dấu là sửa đổi (.IsModified trong đoạn code trên là true) sau đó điều này có nghĩa rằng một trong hai tài liệu tham khảo (Person.Address trong ví dụ trên) đã thay đổi, không có vấn đề nếu thực sự là giá trị tài sản (CountryCity) bên trong loại phức tạp đã thay đổi hay không. Hoặc bất kỳ thuộc tính nào của loại phức tạp đã thay đổi (Country hoặc City đã thay đổi). Tôi tin rằng không thể tìm ra cái nào, vì EF luôn gửi lệnh UPDATE cho tất cả các thuộc tính kiểu phức hợp loại cơ sở dữ liệu, ngay cả khi chỉ có một thuộc tính đã thay đổi và thuộc tính khác không thay đổi. Tôi sẽ kết luận rằng EF không theo dõi các thay đổi của các thuộc tính kiểu phức tạp riêng lẻ.

+2

tuyệt vời, cũng hoạt động cho tôi với khung Entity 6! –

Các vấn đề liên quan