2013-12-11 4 views
2

У меня возникла проблема с Entity Framework 4 при добавлении новой сущности со ссылкой через навигатор к уже существующей. Пожалуйста, обратите внимание на код:Entity Framework 4 Добавление объекта со ссылкой на уже существующий объект

  ControlPolicy cp1 = new ControlPolicy() 
      { 
       ControlPolicyLevelType = 2, //full access to NA 
       MemberState = context.Countries.First(tt => tt.IsMemberState), 
       OperaModuleType = 2, 
       MemberStateIncluded = true, 
       CreateDate = DateTime.Now, 
       CreatedByUserId = 1, 
      }; 
      context.ControlPolicies.AddObject(cp1); 

      context.SaveChanges(); 

Ошибка:

Отношения от «ControlPolicy_MemberState_Country_» AssociationSet в состояние «Добавлено». Учитывая ограничения множественности, соответствующая «страна» также должна находиться в «добавленном» состоянии.

Когда я смотрю на ChangeTracker, объект ControlPolicy фактически находится в состоянии «Добавлено», а Country - в состоянии «Undefined». Я думаю, что это правильно - ведь я не добавляю новый объект, я хочу только обратиться к существующей стране.

+2

У вас есть свойство MemberStateId (внешний ключ)? Попробуйте установить это свойство вместо установки ассоциации. –

+0

Нет, у меня нет такого имущества, только штурман. – Konrad

+1

Вы должны добавить внешний ключ к модели, это спасет вас от боли в будущем. См. Http://blogs.msdn.com/b/adonet/archive/2009/11/06/foreign-key-relationships-in-entity-framework.aspx –

ответ

0

В данном конкретном случае ошибка была сделана в неправильной модели EF. MemberState и Country были в соотношении 1-1, поэтому для EF было очевидно, что при добавлении ControlPolicy необходимо также определить новый MemberState (Страна). Как только отношение навигатора было изменено на правильное m: 1 MemberState: Country, все начало работать.

Кроме того, я нахожу предложение Rui Jarimba FK очень хорошим. Хотя это и не проблема, и это не применимо в моем случае из-за использования ChangeTracker. Очевидно, ChangeTracker не будет знать об изменениях, внесенных через FK. Однако в любом другом случае использование внешних ключей было бы очень удобно и полезно.

0

Я думаю, что проблема связана с запросом Linq в заявлении MemberState = context.Countries.First(tt => tt.IsMemberState). Несколько дней назад такая же ошибка произошла с оператором Find Linq. По Google я нашел решение, которое работает отлично для меня

var zz= context.ControlPolicy.Create().GetType().GetProperty("MemberState").GetValue(cp1); 

context.Entry(dmm.Set<ControlPolicy>().Find(entityKey)).CurrentValues.SetValues(cp1); 
context.SaveChanges(); 
0

Я думаю, что это будет исправить вашу проблему, я могу иметь неверное представление, но из этого сообщения об ошибке я хотел бы попробовать это: -

var country = context.Countries.First(); 

ControlPolicy cp1 = new ControlPolicy() 
      { 
       Country = country, 
       ControlPolicyLevelType = 2, 
       MemberState = country.IsMemberState, 
       OperaModuleType = 2, 
       MemberStateIncluded = true, 
       CreateDate = DateTime.Now, 
       CreatedByUserId = 1, 
      }; 
      context.ControlPolicies.AddObject(cp1); 

      context.SaveChanges(); 
Смежные вопросы