Я пытался воспроизвести эту проблему на основе вашего примера, но, похоже, она работает нормально.Хотя я не использовал Scaffold, просто закодировал класс, и я попробовал модель, создающую код, который у вас был, и у него не было проблем.Я подозреваю, что в этом должно быть что-то большее, потому что только с классом «Assignee» соглашение EF ожидает таблицу «Assignees», поэтому я подозреваю, что настраивается больше сопоставлений.
Протестировано с EF Core2.0.3 и 2.2.4
БД: использовался сценарий ОП.
Сущность:
[Table("Assignee")]
public class Assignee
{
public int AssigneeId { get; set; }
}
Мне пришлось использовать атрибут Table для сопоставления с именем таблицы.
Контекст:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Assignee>(entity =>
{
entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID");
});
}
согласно комментарию OP.
Тест:
[Test]
public void TestIncrement()
{
using (var context = new TestDbContext())
{
var newItem = new Assignee();
context.Assignees.Add(newItem);
context.SaveChanges();
}
}
Работает, как ожидалось.
Однако то, что я обычно имел бы для сущности:
[Table("Assignee")]
public class Assignee
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column("AssigneeID")]
public int AssigneeId { get; set; }
}
И тогда для этого столбца ничего не нужно в контексте переопределения OnModelCreating.
Я подозреваю, что существует некоторая дополнительная скрытая конфигурациягде-то дано, там нет упоминания о проблеме с именем таблицы, добавленной вручную или через скаффолд, который вводит в заблуждение EF.Я полностью ожидал, что EF потерпит неудачу без атрибутов Key / DbGenerated, но, похоже, он работает просто отлично.
Редактировать: также пробовал это с скаффолдингом, запускающим Scaffold-DbContext по всей существующей схеме.Опять работал без проблем.Для сравнения с вашими тестами:
Сгенерированный DbContext: (без изменений сохранить без удаления сведений о предупреждении и строке подключения.)
public partial class AssigneeContext : DbContext
{
public AssigneeContext()
{
}
public AssigneeContext(DbContextOptions<AssigneeContext> options)
: base(options)
{
}
public virtual DbSet<Assignee> Assignee { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Data Source=machine\\DEV;Initial Catalog=Spikes;uid=user;pwd=password;MultipleActiveResultSets=True");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasAnnotation("ProductVersion", "2.2.4-servicing-10062");
modelBuilder.Entity<Assignee>(entity =>
{
entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID");
});
}
}
Сгенерированный объект: (без изменений)
public partial class Assignee
{
public int AssigneeId { get; set; }
}
Я понял, зачем нужна моя табличная аннотация.Ядро EF (не уверен, применимо ли это и к EF6) основывало соглашение для имени таблицы на имя переменной DbSet в DbContext.Я не увидел никакой разницы в конфигурации с контекстом, сгенерированным скаффолдом, и моим собственным, кроме имени DbSet.Я переименовал свое исходное имя DbSetxt в DbContext в «Assignee», и оно работало без атрибута Table.
Тем не менее, основываясь на представленной информации, ваш код должен работать.Что-то скрывается в деталях, потому что этот пример работает, поэтому вам нужно будет предоставить более подробную информацию о примере, который определенно не работает в вашем случае.