2011-12-13 21 views
8

Trong ứng dụng của tôi, tôi đã đoạn mã sau ...Entity Framework Lỗi: Một đối tượng với một giá trị EntityKey rỗng không thể được gắn vào một bối cảnh đối tượng

public Boolean SaveUserInformation(UserInfoDTO UserInformation) 
    { 
     return dataManager.SaveUserInfo(new UserInfo() 
     { 
      UserInfoID = UserInformation.UserInfoID.HasValue ? UserInformation.UserInfoID.Value : 0, 
      UserID = UserInformation.UserID, 
      ProxyUsername = UserInformation.ProxyUsername, 
      Email = UserInformation.Email, 
      Status = UserInformation.Status 
     }); 
    } 

Mã này gọi một phương thức trên một đối tượng DataManager mà sử dụng Entity Framework ...

public Boolean SaveUserInfo(UserInfo userInfo) 
    { 
     try 
     { 
      //Validate data prior to database update 
      if (userInfo.UserID == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with UserID property set to NULL."); } 
      if (userInfo.ProxyUsername == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with ProxyUsername property set to NULL."); } 
      if (userInfo.Email == null) { throw new Exception("UserInfoDomainModel object passed to PriorityOne.Data.DataManager.SaveUserInfo with Email property set to NULL."); } 

      if (userInfo.UserInfoID == 0) 
      { 
       //Perform Insert 
       using (PriorityOneEntities entities = new PriorityOneEntities()) 
       { 
        entities.UserInfoes.AddObject(userInfo); 
        entities.SaveChanges(); 
       } 
      } 
      else 
      { 
       //Perform Update 
       using (PriorityOneEntities entities = new PriorityOneEntities()) 
       { 
        entities.Attach(userInfo); 
        entities.SaveChanges(); 
       } 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      //TODO: Log Error 
      return false; 
     } 

    } 

Chèn mã này hoạt động tốt. Nhưng khi tôi cố gắng thực hiện một bản cập nhật tôi nhận được một lỗi nói: "Một đối tượng có giá trị EntityKey null không thể được gắn vào một bối cảnh đối tượng."

Nó xảy ra trên dòng mã này: entity.Attach (userInfo);

Những gì tôi đang cố gắng hoàn thành là tránh thực hiện một chuyến đi vòng đến cơ sở dữ liệu chỉ để chọn bản ghi mà sau này tôi sẽ thực hiện thay đổi và cập nhật, do đó thực hiện hai chuyến đi vòng đến cơ sở dữ liệu.

Bất kỳ ý tưởng nào đang xảy ra hoặc cách tôi có thể thực hiện tốt hơn điều này?

Cảm ơn.

Trả lời

20

Có vẻ như bạn đang sử dụng EF 4.1+
Bạn phải nói với EF mà bạn muốn thực thể của bạn được cập nhật (trạng thái thay đổi):

//Perform Update 
using (PriorityOneEntities entities = new PriorityOneEntities()) 
{ 
    entities.Entry(userInfo).State = EntityState.Modified; 
    entities.SaveChanges(); 
} 

T.B. Bạn không phải gọi rõ ràng Attach. Nó được thực hiện dưới mui xe.

Cập nhật:
dựa trên nhận xét của bạn, bạn đang sử dụng EF 4.0. Dưới đây là những gì bạn phải làm để đính kèm đối tượng của mình dưới dạng sửa đổi trong EF 4.0:

ctx.AddObject("userInfoes", userInfo); 
ctx.ObjectStateManager.ChangeObjectState(userInfo, EntityState.Modified); 
ctx.SaveChanges(); 

Bạn không thể sử dụng phương pháp Attach. Từ http://msdn.microsoft.com/en-us/library/bb896271.aspx:

If more than one entity of a particular type has the same key value, the Entity Framework will throw an exception. To avoid getting the exception, use the AddObject method to attach the detached objects and then change the state appropriately.

+0

Đó là điều đầu tiên tôi nghĩ đến nhưng lỗi sẽ khác. Đúng? – Shymep

+0

Theerror là vì thực thể của bạn ở trạng thái "Đã thêm". Nhưng bạn có một thực thể tương tự trong cơ sở dữ liệu với cùng khóa chính. bạn phải tự thay đổi trạng thái. Thử nghiệm và hoạt động ok. – Kamyar

+0

Tôi dường như không có quyền truy cập vào phương thức Entry() trên đối tượng thực thể của tôi. Bạn có thể cho tôi thêm một chút hướng dẫn không? – jdavis

3

Từ MSDN

The object that is passed to the Attach method must have a valid EntityKey value. If the object does not have a valid EntityKey value, use the AttachTo method to specify the name of the entity set.

Hy vọng điều này sẽ giúp bạn.

+0

Tôi đã sử dụng phương thức AttachTo như thế này: entity.AttachTo (entities.UserInfoes.EntitySet.Name, userInfo); Và điều đó sẽ xử lý lỗi. Tôi không còn có ngoại lệ, nhưng tôi không thấy những thay đổi trong cơ sở dữ liệu. – jdavis

+1

Hãy thử [bài viết] này (http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx). – Shymep

+0

Bạn đã thử làm như sau: 'dc.AttachToOrGet (userInfo.EntityKey.EntitySetName, ref userInfo);'? Điều này làm việc tốt cho tôi (trong đó 'dc' là ngữ cảnh dữ liệu). Đặc biệt, nếu cùng một đối tượng tồn tại ở một nơi khác thì nó sẽ đưa bạn tham chiếu gốc trỏ đến cùng một cá thể. – Matt

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