Суть в чем- не хочу морочиться с полем Id через секвенции или каждый раз получать последний id+1, хочу автогенерацию поля.
Когда оно NOT NULL GENERATED BY ALWAYS AS IDENTITY то через insert в SQL все нормально работает, но через EF6 выдает ошибку
PostgresException: 428C9: вставить данные в столбец "Id" нельзя
Вот код настройки поля:
public void DistrictConfigure(EntityTypeBuilder<District> modelBuilder)
{
modelBuilder
.ToTable("Districts", "dict");
modelBuilder.Property(x => x.Id).UseIdentityAlwaysColumn();
}
В SQL это выглядит так:
"Id" integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 )
А вот так пытаюсь добавить:
using (passportEntities db = new passportEntities())
{
db.Districts.RemoveRange(db.Districts);
db.SaveChanges();
db.Districts.Add(new Districts { Name="test"});
db.SaveChanges();
}
И выбрасывает ошибку, хотя поля Id я вообще не касаюсь никак.
Вот код самой модели:
В приложении которое создает (code first)
public class District
{
public int Id { get; set; }
public string Name { get; set; }
public List<Sector> Sectors { get; set; } = new List<Sector>();
}
И в приложении которое я пишу для переноса данных из другой БД сгенерированное (Database first)
public partial class Districts
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Districts()
{
this.Sectors = new HashSet<Sectors>();
}
public int Id { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Sectors> Sectors { get; set; }
}
Я понимаю что можно просто использовать sql раз уж он при таких настройках работает, но мне хотелось бы разобраться почему через Entity Framework не работает. Пробовал и в других таблицах ради теста где в модели ставил атрибуты
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
и результат тот же.