Обновление ef6 нарушение ограничения primary key невозможно вставить повторяющийся ключ в объект

Я пытаюсь сначала обновить отношения "многие ко многим", используя код EF. Всякий раз, когда я обновляю, я получаю эту ошибку, DietaryListings в ошибке - это таблица соединений, созданная миграциями:

Violation of PRIMARY KEY constraint 'PK_dbo.DietaryListings'. Cannot insert duplicate key in object 'dbo.DietaryListings'. The duplicate key value is (1, 52). The statement has been terminated.

Я понимаю, что до обновления в DietaryListings уже существовали повторяющиеся данные. Я просто не понимаю, почему EF не разрешает обновление, используя сопоставленную связь между Listing и Dietary. Разве EF не следует обновлять отношения, если они меняются? Нужно ли мне вручную удалять повторяющиеся записи в этой объединенной таблице перед обновлением EF для объекта?

В моем MVC Controller я пытаюсь обновить существующий объект данными модели, переданными из бритвенного представления, используя это:

//listing = updated model from razor view
//listingExisting = listing from db service 
foreach (var dietary in listing.Dietaries)
{
    if (dietary.Selected)
    {
        listingExisting.Dietaries.Add(dietary);
    }
}
listingExisting.ObjectState = Repository.Pattern.Infrastructure.ObjectState.Modified;
_listingService.Update(listingExisting);

Класс листинга:

public partial class Listing : Repository.Pattern.Ef6.Entity
{
    public Listing()
    {   
        this.Dietaries = new List<Dietary>();  
    }
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Dietary> Dietaries { get; set; }
}

Диетический класс:

public partial class Dietary: Repository.Pattern.Ef6.Entity  
{
    public Dietary()        
    {            
        this.Listings = new List<Listing>();       
    }
    public int ID { get; set; }
    public string Name { get; set; }     
    public virtual ICollection<Listing> Listings { get; set; }         
}

Я просмотрел все эти ссылки и некоторые из них были полезны, но не сработали: ссылка1ссылка2link3link4ссылка5ссылка6

Если ваша идея обновляется, почему вы звоните в listingExisting.Dietaries.Add(dietary);? Это добавление объект, как если бы он был новым, поэтому EF пытается вставить новый, а не обновлять. Кроме того, если вы хотите обновить, что вы хотите обновить, поскольку класс Dietary не имеет никаких свойств, кроме ID?

Alisson 26.10.2018 05:59

Есть ли у вас пустое свойство в листинге. Диетические продукты? Если вы хотите обновить, не должно быть пустого свойства в листинге. Диетические продукты, особенно объекты pk и fk.

hakantopuz 26.10.2018 14:18

@Alisson Я обновляю Dietaries, который есть в Listing. Итак, Listing может иметь диетическое1, диетическое2 ... диетическое10. В настоящее время в базе данных 10 dietaries, поэтому любой Listing может иметь любое количество dietaries от 0 до 10. Я не обновляю никакую сущность dietary, только диетические продукты, содержащиеся в списке. Для простоты я удалил все поля из своих классов, так как обновлялась только связь. Я обновил свой вопрос и добавил поля имени, чтобы они не выглядели как пустые классы.

Heinrich 26.10.2018 19:50
0
3
609
0

Другие вопросы по теме