2010-04-01 29 views
10

Tôi gặp sự cố với các đối tượng làm mới trong cơ sở dữ liệu của mình. Tôi có hai máy tính và hai ứng dụng.Entity Framework - làm mới các đối tượng từ cơ sở dữ liệu

Trên PC đầu tiên, có một ứng dụng giao tiếp với cơ sở dữ liệu của tôi và thêm một số dữ liệu vào bảng Đo lường. Trên máy tính khác của tôi, có một ứng dụng truy xuất Bộ đo mới nhất dưới một bộ hẹn giờ, vì vậy nó cũng nên thử lại các phép đo được thêm vào bởi ứng dụng trên PC đầu tiên của tôi.

Vấn đề là không. Khi ứng dụng của tôi bắt đầu, nó lưu trữ tất cả dữ liệu từ cơ sở dữ liệu và không bao giờ nhận được dữ liệu mới được thêm vào. Tôi sử dụng phương thức Refresh() hoạt động tốt khi tôi thay đổi bất kỳ dữ liệu nào được lưu trong bộ nhớ cache, nhưng nó không làm mới dữ liệu mới được thêm vào.

Đây là phương pháp của tôi mà phải cập nhật dữ liệu:

public static Entities myEntities = new Entities(); 

    public static Measurement GetLastMeasurement(int conditionId) 
    { 
     myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 

     return (from measurement in myEntities.Measurements 
       where measurement.ConditionId == conditionId 
       select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
    } 

T.B. Ứng dụng có các chuỗi kết nối khác nhau trong app.config (các tài khoản khác nhau cho cùng một DB).

+0

Bạn có thể kiểm tra câu trả lời của tôi ở đây http://stackoverflow.com/questions/1746941/objectcontext-refresh –

Trả lời

9

này nên làm việc:

public static Entities myEntities = new Entities(); 

public static Measurement GetLastMeasurement(int conditionId) 
{ 
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database 

    return (from measurement in allMeasurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

cảm giác gì làm cho bộ nhớ đệm khi bạn làm mới cửa hàng mỗi khi bạn muốn sử dụng nó? Bạn có thể gọi cho:

public Measurement GetLastMeasurement(int conditionId) 
{ 
    var entities = new Entities(); 
    return (from measurement in entities.Measurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

Nó cũng tìm kiếm trong cơ sở dữ liệu với mọi cuộc gọi, nhưng hoạt động ít hơn nhiều.

+0

giải pháp đầu tiên mà bạn đề cập vẫn không truy xuất dữ liệu mới được bổ sung từ cơ sở dữ liệu của tôi. Giải pháp thứ hai của bạn mà tôi dự kiến ​​làm việc, cũng không hoạt động. Tôi không thích nó bởi vì cách này tôi mở một bối cảnh mới trên cơ sở dữ liệu của tôi mỗi khi tôi muốn có được phép đo cuối cùng. Khi tôi khởi động lại ứng dụng, nó sẽ lấy lại dữ liệu mới, nhưng nó không phát triển lại nếu có gì đó được thêm vào trong khi ứng dụng đang hoạt động. Có thể cho rằng các tài khoản khác nhau mà tôi đang sử dụng cho mỗi ứng dụng (một tài khoản bổ sung và một tài khoản truy xuất dữ liệu từ DB) là lý do cho điều này không? –

+0

@Nebo: Giải pháp thứ hai không hoạt động? Nó quay trở lại cái gì? – LukLed

+0

Với bất kỳ hai giải pháp nào tôi nhận được giống như tôi đã có. Nếu tôi chỉnh sửa một hàng trong bảng Đo lường (đã được thử lại khi bắt đầu ứng dụng), nó sẽ cập nhật nó. Nhưng nếu tôi thêm một hàng mới, nó sẽ không chạy lại nó. Trong cả hai trường hợp. Lần này tôi đã chỉnh sửa một hàng mới và đã thêm trực tiếp bằng cách sử dụng SQL Manangement Studio của tôi. –

8

Kể từ EF 4.1, bạn có thể sử dụng phương thức AsNoTracking() trên thực thể của mình.

return myEntities.Measurements.AsNoTracking(); 

Lưu ý rằng AsNoTracking() sẽ không thêm thực thể vào ngữ cảnh của bạn để theo dõi, nhưng chỉ trả lại chúng từ cửa hàng dữ liệu của bạn.

Để biết thêm thông thấy http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx

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