EF 4.0 UpdateException - PullRequest
       7

EF 4.0 UpdateException

2 голосов
/ 15 февраля 2010

Я использую EF 4.0 в VS 2010 RC. У меня довольно простая структура класса POCO с несколькими зависимостями. Каждый класс POCO имеет базовый универсальный класс (EntityObject или ValueObect) с идентификатором свойства. У меня есть несколько тестов CRUD, и только один из них работает. Это очень просто, когда объект не имеет каких-либо зависимостей. Но когда я тестирую что-то с зависимостями FK, я всегда получаю одну и ту же ошибку: System.Data.UpdateException: значение, общее для сущностей или ассоциаций, генерируется в нескольких местах. Убедитесь, что сопоставление не разделяет EntityKey на несколько столбцов, созданных магазином. Я гуглил это, но единственная причина этого исключения, которое я обнаружил, - это использование нескольких контекстов, что не в моем случае.

 using (IEntityModelContext context = new EFDataContext()) {  
            var licTypeFact = context.GetFactory<LicenceType>();  
            var metaValFact = context.GetFactory<MetaValue>();  
            var cultSpecFact = context.GetFactory<CultureSpecificValue>();  
            LicenceType licType = licTypeFact.CreateObject();  
            Assert.IsNotNull(licType);  
            Assert.IsTrue(licType.IsTransient);  
            licType.AdvancedFeatureSet = true;  
            licType.BasicFeatureSet = true;  
            licType.MaxUsers = 10;  
            licType.MonthDuration = 1;  
            MetaValue licTypeName = metaValFact.CreateObject();  
            licTypeName.Name = "TestLicType";  
            CultureSpecificValue licNameEng = cultSpecFact.CreateObject();  
            licNameEng.Value = "Test Licence";  
            licNameEng.Culture = context.CultureRepository.Load(cult => cult.Name == "Eng");  
            licNameEng.MetaValue = licTypeName;  
            licTypeName.CultureSpecificValues = new List<CultureSpecificValue>();  
            licTypeName.CultureSpecificValues.Add(licNameEng);  
            licType.Name = licTypeName;  
            licType.NumberOfQuestionsPerSurvey = 1;  
            licType.NumberOfResponsesPerSurvey = 2;  
            licType.NumberOfSurveys = 3;  
            licType.PerUserPrice = 10;  
            licType.Price = 100;  
            context.LicenceTypeRepository.Add(licType);  
            int res = context.SaveChanges();                 

Так в чем же причина этого исключения?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

K. Я думаю, что нашел причину такого рода проблем. У меня есть ситуация со многими ко многим в моей диаграмме EF (таблица Scholarhip, таблица Survey, таблица ScholarshipSurvey {это таблица мостов}). Ну, после некоторого серьезного поиска души я нашел это в своей записи таблицы ScholarshipSurvey в EDMX:

    <EntityType Name="ScholarshipSurvey">
      <Key>
        <PropertyRef Name="ScholarshipID" />
        <PropertyRef Name="SurveyID" />
      </Key>
      <Property Name="ScholarshipID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="SurveyID" Type="int" Nullable="false" StoreGeneratedPattern="Identity"/>
    </EntityType>

Я думал, ни за что! Почему EF сделал эти "тождества". Их нет в модели данных, откуда пришли. Поэтому, когда я открыл EDMX с помощью редактора XML (вместо двойного щелчка по умолчанию), я удалил запись StoreGeneratedPattern = "Identity" для идентификатора стипендии и идентификатора опроса. Затем я попробовал свой обычный код для добавления элементов в коллекцию и удаления элементов из коллекции, и он РАБОТАЛ!

Все, что я могу думать, это то, что это ошибка в EF4, которой не должно было быть. Единственный другой способ решить эту проблему - сделать таблицу мостов объектом, добавив в нее свою личность. Gee. Надеюсь, что это поможет бедной душе там.

Обновление (rwwilden): для этой проблемы существует отчет Microsoft Connect .

0 голосов
/ 16 февраля 2010

Однако первоначальная проблема ушла после воссоздания edmx, возникла еще одна. У меня есть класс, определение которого выглядит так:

  public class ValueList: EntityObject<Int32> {        
        public virtual MetaValue Name { get; set; }       
        public virtual IList<MetaValue> Values { get; set; }      
     }

А вот определение класса MetaValue:

  public class MetaValue :
 EntityObject<Int32> {        
        public string Name { get; set; }       
         public virtual IList<CultureSpecificValue>
 CultureSpecificValues { get; set; }   
    }

Свойство Values ​​в ValueList представляет отношение «многие ко многим» между таблицами ValueLists и MetaValues ​​(соединение таблицы ValueListMetaValues ​​с двумя столбцами FK и PK на обоих). Тест CRUD для этого элемента выглядит следующим образом:

 using (IEntityModelContext context =
 new EFDataContext()) {  
                var valueListFact = context.GetFactory<ValueList>();  
                 ValueList newValList = valueListFact.CreateObject();  
                 Assert.IsNotNull(newValList);  
                Assert.IsTrue(newValList.IsTransient);  
                 var metaValFact = context.GetFactory<MetaValue>();  
                 var cultSpecFact = context.GetFactory<CultureSpecificValue>();  
                 MetaValue listName = metaValFact.CreateObject();  
                 MetaValue valOne = metaValFact.CreateObject();  
                 MetaValue valTwo = metaValFact.CreateObject();  
                 listName.Name = "list";  
                 valOne.Name = "One";  
                 valTwo.Name = "Two";                  
                 newValList.Name = listName;  
                 newValList.Values = new List<MetaValue>() { valOne, valTwo
 };  
                 context.ValueListRepository.Add(newValList);  
                 context.SaveChanges();

Таким образом, после context.SaveChanges () listName сохраняется, а valOne и valTwo - нет. Более того, после отсоединения и извлечения этого объекта из БД его свойство «Значения» заполняется одним значением - «listName» и «Имя» (тот же объект в свойствах «Имя» и «Значения»). Итак, проблема снова в edmx, или такая структура (с FK и manyTomany в одном и том же объекте) как-то неверно истолкована EF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...