Значение первичного ключа в Entity Framework - PullRequest
0 голосов
/ 13 января 2020

Структура объекта содержит значение int объекта (VenueId prop), собственную id и другую информацию.

CONSTRAINT [FK_Venue_Layout] FOREIGN KEY ([VenueId]) REFERENCES [dbo].[Venue] ([Id])

Когда я пытаюсь добавить два макета с одинаковым VenueId, я получаю эту ошибку

Изменения в базе данных были подтверждены успешно, но ошибка произошло при обновлении контекста объекта. ObjectContext может быть в несовместимом состоянии. Внутреннее сообщение об исключении: сбой при сохранении или принятии изменений, поскольку несколько объектов типа DataAccess.Models.LayoutModel имеют одинаковое значение первичного ключа. Убедитесь, что явно установленные значения первичного ключа являются уникальными. Убедитесь, что сгенерированные базой данных первичные ключи правильно настроены в базе данных и в модели Entity Framework. Используйте Entity Designer для базы данных First / Model First. Используйте свободно распространяемый API HasDatabaseGeneratedOption или DatabaseGeneratedAttribute для конфигурации Code First. "

Код моей сущности:

[Table("Layout")]
public class LayoutModel
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int VenueId { get; set; }

    public string Description { get; set; }
}

Код вставки:

var layouts = new List<LayoutModel>
            {
                new LayoutModel { VenueId = 1, Description = "First layout" },
                new LayoutModel { VenueId = 1, Description = "Second layout" },
            };
            _context.Layouts.AddRange(layouts);
            _context.SaveChanges();

Я не могу использовать навигационные свойства

1 Ответ

1 голос
/ 13 января 2020

Идентификационный столбец или свойство помечается как идентификационный столбец в определении LayoutViewModel

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }

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

var layouts = new List<LayoutModel> { 
    new LayoutModel { /*Id = 1,*/ VenueId = 1, Description = "First layout" }, 
    new LayoutModel { /*Id = 2, */ VenueId = 1, Description = "Second layout" }
};
// code smell
foreach(var layout in layouts)
{
     context.Entry(layout).State = EntityState.Added;
}
_context.Layouts.AddRange(layouts);
_context.SaveChanges();

Также, пожалуйста, обновите вашу LayoutModel, как показано ниже:

public class LayoutModel
{
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     [Key]
     [Column(Order = 0)]
     public int Id { get; set; }

     [Key]
     [Column(Order = 1)]
     //[ForeignKey("Venue")]
     [DatabaseGenerated(DatabaseGeneratedOption.None)]
     public int VenueId { get; set; }

     //public virtual VenueModel Venue { get; set; } //Please correct Venue property type
}

Кроме того, проверьте, загружено ли место в _context. Макеты или нет.

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