0

Ввод ключей вручную с помощью Entity Framework

14

Описание проблемы:

Я пытаюсь использовать Entity Framework с подходом "code first" для простого проекта базы данных, и столкнулся с проблемой, которую не могу решить.

Я заметил, что EF автоматически устанавливает значение ID для моих таблиц, увеличивая его на 1 каждый раз и полностью игнорируя значение, которое я ввел вручную для этого поля. После некоторых поисков, я понял, что правильный способ отключить это поведение — использовать следующий код:

modelBuilder.Entity<Event>().Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

Однако теперь я получаю следующую ошибку и не понимаю, почему:

Unhandled Exception:
System.Data.Entity.Infrastructure.DbUpdateException: An error 
occurred while updating the entries. See the inner exception for 
details. ---
System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. --->
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'Events' when IDENTITY_INSERT is set to OFF.

Если это поможет, вот класс POCO, о котором идет речь:

public class Event
{
    [Key, Required]
    public int EventID { get; set; }

    public string EventType { get; set; } //TODO: Event Type Table later on
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
    public virtual ICollection<EventParticipation> EventParticipation { get; set; }
}

Заранее спасибо за помощь.

1 ответ(ов)

0

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

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

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

Обратите внимание: это также работает в EF Core.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь