2012-04-05 23 views
19

Tôi đang cố gắng cập nhật một thực thể có mối quan hệ FK trong EntityFramework 4.3 Code Đầu tiên. Tôi cố gắng đính kèm với các điều khoản liên quan bằng cách gọi: Mục nhập (mục) .State = EntityState.UnchangedEntityFramework Code Đầu tiên - Kiểm tra xem thực thể có được đính kèm

Tôi nhận được ngoại lệ sau: Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager. ObjectStateManager không thể theo dõi nhiều đối tượng bằng cùng một khóa.

Tôi không cập nhật các mục này cũng như không có thuộc tính id cho chúng trên thực thể chính của tôi. Có thể biết các thực thể nào được đính kèm hay không?

Cảm ơn trước, Radu

+0

Bạn có thể sử dụng phương pháp ObjectContext.ObjectStateManager.GetObjectStateEntries() (http://msdn.microsoft.com/en-us/library/bb738497.aspx) để có được tất cả các thực thể được theo dõi bởi bối cảnh. Lưu ý rằng điều này có thể là có các thực thể trong cơ sở dữ liệu không được ObjectContext theo dõi. Bạn cần phải cung cấp một trạng thái để cho ObjectStateManager biết những thực thể nào bạn cần (các enums này có thuộc tính Flags để bạn có thể kết hợp các giá trị khác nhau bằng cách sử dụng |) – Pawel

Trả lời

42

Bạn có thể tìm thấy câu trả lời here.

public bool Exists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

Đặt mã đó vào ngữ cảnh của bạn hoặc bạn có thể biến mã đó thành tiện ích mở rộng như vậy.

public static bool Exists<TContext, TEntity>(this TContext context, TEntity entity) 
    where TContext : DbContext 
    where TEntity : class 
{ 
    return context.Set<TEntity>().Local.Any(e => e == entity); 
} 
+2

Cảm ơn. Điều này cũng đã giúp tôi. Một lưu ý khác với hàm ở trên. Bạn cần đặt nơi T: class, hoặc trình biên dịch khác sẽ khiếu nại. – Sylpheed

+0

@Sylpheed Cảm ơn, tôi đã cập nhật câu trả lời Theo đề xuất của bạn –

+0

TContext không cần thiết, hãy để tham số đầu tiên là kiểu DbContext thay thế - public static bool Exists (ngữ cảnh DbContext này, thực thể TEntity) ... –

5

Bạn có thể sử dụng phương pháp này:

/// <summary> 
    /// Determines whether the specified entity key is attached is attached. 
    /// </summary> 
    /// <param name="context">The context.</param> 
    /// <param name="key">The key.</param> 
    /// <returns> 
    /// <c>true</c> if the specified context is attached; otherwise, <c>false</c>. 
    /// </returns> 
    internal static bool IsAttached(this ObjectContext context, EntityKey key) 
    { 
     if (key == null) 
     { 
      throw new ArgumentNullException("key"); 
     } 

     ObjectStateEntry entry; 
     if (context.ObjectStateManager.TryGetObjectStateEntry(key, out entry)) 
     { 
      return (entry.State != EntityState.Detached); 
     } 
     return false; 
    } 

Ví dụ:

 if (!_objectContext.IsAttached(entity.EntityKey)) 
     { 
      _objectContext.Attach(entity); 
     } 
+3

Tôi đã thực hiện một số kiểm tra hiệu suất và (ngạc nhiên) đã thấy ObjectStateManager.TryGetObjectStateEntry chậm hơn 70 lần so với Thiết lập () .Local.Any ( – Brent

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