ASP.NET MVC и Entity Framework.Как избежать повторяющихся строк? - PullRequest
1 голос
/ 07 марта 2011

Итак, я новичок в ASP.NET MVC и пытаюсь реализовать менеджер адресов. Я использую Linq2Entity Framework.У меня есть таблица с контактами и одна с номерами телефонов.Эти две таблицы связаны таблицей contact_has_phone_number.Entity Framework позволяет мне получить все телефонные номера, которые назначены одному контакту.Это делается путем вызова contact.PhoneNumbers, который возвращает коллекцию телефонных номеров.Новый номер добавляется с contact.PhoneNumber.Add (номер).Проблема в том, что я получаю повторяющиеся записи телефонных номеров в таблице телефонных номеров.То, что я хотел бы получить, - то, что существующий номер телефона связывается только в таблице contact_has_phone_number.Например:

Таблица "contact"

ID_Contact  | First_Name |  Last_Name  
1           |   Jeff     |    Bridges  
2           |   Peter    |    Miller  

Таблица "contact_has_phone_number"

ID_Contact  | ID_Number  
1           |    1  
1           |    2  
2           |    1  

Таблица "phone_number"

ID_Number  | Number  
1          | 1234567  
2          | 7654321  

Уmomonet Я бы получил 3 строки в таблице "phone_number" с 2 строками с одинаковыми номерами.

ID_Number  | Number  
1          | 1234567  
2          | 7654321  
3          | 1234567  

Было бы здорово, если бы вы могли помочь мне с этим.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2012

У меня была очень похожая проблема с дублирующимися записями, возникающими при использовании EF.После долгих путаниц я наконец-то нашел решение:

Вы всегда должны прикреплять вновь созданные сущности к таблице перед выполнением .SaveChanges ()

Моя проблема заключалась в том, что SaveChanges вызывался перед присоединением новогосущность, которую я создал для таблицы, поэтому после вызова SaveChanges была создана одна сущность, а после AddObject () вызвана другая дублирующаяся сущность; SaveChanges ();был выполнен.

TL; DR:

Результат с дублирующимися записями:

Pro.Machine = new XXXDB.Machine();
Pro.Machine.Translate(machine); // SaveChanges() was being called by this method.
XXXDB.XXXDB.DB.Machines.AddObject(Pro.Machine);
XXXDB.XXXDB.DB.SaveChanges();

был изменен на:

Pro.Machine = new XXXDB.Machine();
XXXDB.XXXDB.DB.Machines.AddObject(Pro.Machine);
Pro.Machine.Translate(machine); //SaveChanges() occurs after attaching to the machines table.
XXXDB.XXXDB.DB.SaveChanges();

Примечание: имена баз данныхизменен для защиты привилегированного клиента.

0 голосов
/ 07 марта 2011

Это ситуация многих ко многим. Я столкнулся с такой ситуацией (не связанной с контактами), и это то, что я сделал.

При создании нового контакта у меня будут контактные данные, а также номера телефонов. приведенный ниже код может быть использован

public void AddNewContact(Contact contact)
{
    var storedPhones = context.PhoneNumbers.Select(s => s).ToList();
            foreach (var s in contact.PhoneList)
            {
                var p = s.PhoneNumber; 
                var storedPhone = storedPhone s.Where(f => f.PhoneNumber == p).Select(t => t).FirstOrDefault();
                if (storedPhone == null)
                {
                    var newPhoneNumber = MySqlEFModel.PhoneNumber.CreatePhoneNumber(Guid.NewGuid(), p);
                    context.AddToPhoneNumbers(newPhone);
                    contact.PhoneNumbers.Add(newPhone);
                }
                else
                {
                    contact.PhoneNumbers.Add(storedPhone);
                }
            }
        context.AddToContacts(contact);
        context.SaveChanges();
}

EDIT:

Я должен был сделать это в начале метода, перед циклом.

                    var newContact = MySqlEFModel.Contact.CreateContact(keyfields, ... ... , ...);

Затем строки

contact.PhoneNumbers.Add (storedPhone);

станет

newContact.PhoneNumbers.Add (storedPhone);

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