Я новичок в использовании EF, а также ASP.NET Core. Я работаю над простым веб-приложением и получаю сообщение об ошибке, когда пытаюсь сохранить новую запись. Когда вызывается DbContext.SaveChanges(), я получаю сообщение об ошибке:
«Невозможно вставить явное значение для столбца идентификаторов в таблицу «ContactTypes», если для параметра IDENTITY_INSERT установлено значение OFF».
Я точно понимаю, что означает сообщение и почему я его получаю. На основании этого сообщения EF пытается вставить запись в таблицу ContactTypes, и поскольку эта таблица не позволяет вставлять значение первичного ключа, выдается эта ошибка. В таблице ContactTypes есть набор фиксированных записей, которые, скорее всего, не изменятся. Записи из таблицы ContactTypes используются для заполнения раскрывающегося списка (элемент выбора HTML). Эта функция работает нормально, и когда пользователь выбирает нужный вариант, а затем пытается сохранить родительскую (клиентскую) запись, EF хочет вставить новую запись в таблицу ContactTypes, что не нужно. Когда EF Core создал базу данных, в таблицу Clients было добавлено поле «ContactTypeID», которое должно содержать идентификатор выбранного типа ContactType.
Ниже мои классы
public class Client
{
public int ID { get; set; }
public Person Person { get; set; }// = new Person();
public ContactType ContactType { get; set; }// = new ContactType();//Client or Inquiry
//other properties removed for brevity
}
public class ContactType
{
public int ID { get; set; }
[StringLength(20)]
public string ContactTypeDescription { get; set; } //typically either Client or Inquiry
}
public class Person
{
public int ID { get; set; }
[Required, StringLength(50)]
public string FirstName { get; set; } = "N/A";
[Required, StringLength(50)]
public string LastName { get; set; } = "N/A";
//other properties removed for brevity
}
Вот мой метод OnModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//setup our relationships
modelBuilder.Entity<Client>()
.HasOne(c => c.Person);
modelBuilder.Entity<Client>()
.HasOne(c => c.ContactType)
.WithMany();
//create our other supporting tables and initialize data if necessary
modelBuilder.Entity<Person>().ToTable("People");
modelBuilder.Entity<Person>().HasData(new Person { ID = 1, FirstName = "N/A", LastName = "N/A" });
modelBuilder.Entity<ContactType>()
.ToTable("ContactTypes");
modelBuilder.Entity<ContactType>().HasData(new ContactType { ID = 1, ContactTypeDescription = "Not Specified" },
new ContactType { ID = 2, ContactTypeDescription = "Inquiry" },
new ContactType { ID = 3, ContactTypeDescription = "Client" });
}
Вот моя разметка для выбора HTML
<div class = "col-sm-3">
<label for = "type" class = "form-label stacked-justify-left">Contact Type</label>
<select asp-for = "Client.ContactType.ID" asp-items = "Model.ContactTypes" class = "form-control" style = "height:40px; width:180px">
<option value = "">-- Select Type --</option>
</select>
<span asp-validation-for = "Client.ContactType.ID" class = "text-danger font-weight-bold"></span>
</div>
Поэтому я не знаю, как запретить EF Core добавлять записи в таблицу ContactTypes при сохранении информации об объекте Client. Если нужна другая информация, пожалуйста, спросите, и я предоставлю. Любая помощь приветствуется.





Вероятно, класс Client должен быть:
public class Client
{
public int ID { get; set; }
public Person Person { get; set; }// = new Person();
public int ContactTypeID { get; set; }
public ContactType ContactType { get; set; }// = new ContactType();//Client or Inquiry
}
public class ContactType
{
public int ID { get; set; }
[StringLength(20)]
public string ContactTypeDescription { get; set; } //typically either Client or Inquiry
public IList<Client> Clients { get; set; }
}
modelBuilder.Entity<Client>()
.HasOne(c => c.ContactType)
.WithMany()
.HasForeignKey(c => c.ContactTypeId);
И измените представление как:
<select asp-for = "Client.ContactTypeID" asp-items = "Model.ContactTypes" class = "form-control" style = "height:40px; width:180px">
<option value = "">-- Select Type --</option>
</select>
<span asp-validation-for = "Client.ContactTypeID" class = "text-danger font-weight-bold"></span>
Справка
Я откатил вашу ревизию. Не следует так резко менять вопрос, если вы получили ответы. Задайте новый вопрос, если после получения полезных ответов возникнут новые проблемы.