2012-03-18 3 views
0

У меня возникла странная проблема, я не могу получить объект из БД, а затем снова подключить его. Я написал такой код для других проектов, но по какой-то нечетной причине он вызывает следующую ошибку в этом приложении:Свойство EntityKey может быть установлено только, LINQ2Entities

System.InvalidOperationException: Свойство EntityKey может быть установлено только в том случае, если текущее значение свойства равно null.

вот мой код:

 Entities.Customer customer; 
     using (var context = new XXEntities()) 
     { 
      IQueryable<Entities.Customer> query = from a in context.Customers select a; 
       query = query.Where(c => c.CODE == "003046"); 
      customer = query.ToList()[0]; 
     } 


     using (var context = new XXEntities()) 
     { 
      context.Customers.AddObject(customer); 
      context.SaveChanges(); 
     } 
+0

Может быть лучшим вариантом было бы оставить запись прикрепленной. Выполняйте всю свою бизнес-логику в другом месте, а затем, когда у вас есть все изменения, которые вы хотите сделать, передайте объект, содержащий обновленные данные, методу, в котором вы запрашиваете БД, внесите изменения и сохраните изменения, все в такой же метод, чтобы запись всегда была прикреплена. Выполнение этого на вашем пути приведет к проблемам позже, в какой-то момент. – frenchie

+0

Я должен был дать больше контекста на вопрос, извините, что я делаю следующее: GET OBJECT -> PARSE OBJECT TO DTO -> PASS DTO через WS -> MODIFY DTO -> PASS DTO BACK через WS -> REMAP DTO TO ENTITY -> SAVE ENTITY. Проблема в том, что я потерял весь связанный материал LINQ2Entities, чтобы узнать, новый или изменен объект. – Joshy

+0

Это может работать наоборот: Прикрепите новый объект с Id = null. Хотя я не совсем уверен. –

ответ

0

Во 2-м блоке,

using (var context = new XXEntities()) 
    { 
     //context.Customers.AddObject(customer); 
     context.Customers.Attach(customer); 
     context.SaveChanges(); 
    } 

EntitySet.Add() средство добавить новый объект. Вы хотите добавить существующий объект.

+0

Просто дополнительное подзапрос, но не Linq2EF требует, чтобы вы сначала отделили его от другого контекста? – Silvermind

+1

@Silvermind: использование в первом тайме должно позаботиться об этом. 1-й контекст расположен. –

+0

Спасибо. Я мог бы запомнить неправильно, но в другом: Linq2SQL Я думал, что это необходимо, поэтому мой вопрос. – Silvermind