#c_sharp #postgresql #entity_framework_core
Генерируется база данных с начальными данными.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().HasData(
new Chair[]
{
new Chair {Id = 1, Name = "ПМИ" },
new Chair {Id = 2, Name = "АСОИУ" },
new Chair {Id = 3, Name = "ИЯ" },
new Chair {Id = 4, Name = "СИБ" }
});
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new ChairConfiguration());
}
}
public class ChairConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(c => c.Id);
builder.Property(c => c.Name).IsRequired();
}
}
Потом в программе считывается файл, где может оказаться, что нет необходимой записи
в базе данных, тогда ее туда нужно добавить.
private int GetChairIndex(string chairName)
{
using (ApplicationContext db = new ApplicationContext())
{
if (db.Chairs.Where(c => c.Name == chairName).ToList().Count() == 0)
{
var chair = new Chair(chairName);
db.Chairs.Add(chair);
db.SaveChanges();
}
return db.Chairs.Where(c => c.Name == chairName).Single().Id;
}
}
На этом этапе выскакивает исключение из-за повторения ключа (Id). Причем при первом
запуске происходит попытка новой записи присвоить Id = 1, при каждом следующем запуске
Id увеличивается каким-то магическим образом. В итоге, на пятой попытке происходит
успешное добавление. Почему Entity Framework сразу не может понять, какой Id нужно
присвоить новой записи?
Класс Chair:
public class Chair
{
public int Id { get; set; }
public string Name { get; set; }
public List Rooms { get; set; }
public List Disciplines { get; set; }
public List Groups { get; set; }
public Chair()
{
Rooms = new List();
Disciplines = new List();
Groups = new List();
}
public Chair(int id, string name)
{
Id = id;
Name = name;
Rooms = new List();
Disciplines = new List();
Groups = new List();
}
public Chair(string name)
{
Name = name;
Rooms = new List();
Disciplines = new List();
Groups = new List();
}
public override bool Equals(object obj)
{
if (obj.GetType() != this.GetType())
{
return false;
}
Chair c = (Chair)obj;
return (this.Id == c.Id && this.Name == c.Name);
}
}
Ответы
Ответ 1
Решение проблемы оказалось интересным и спорным, указано оно здесь: https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/367 Предлагается два способа: Вставлять начальные данные с отрицательными индексами; modelBuilder.Entity().HasData( new Chair[] { new Chair {Id = -1, Name = "ПМИ" }, new Chair {Id = -2, Name = "АСОИУ" }, new Chair {Id = -3, Name = "ИЯ" }, new Chair {Id = -4, Name = "СИБ" } }); При инициализации базы данных начинать индексацию с определенного значения. В моем случае с 5, так как 4 записи уже вставлены. modelBuilder.HasSequence ("ChairsIds") .StartsAt(5); modelBuilder.Entity () .Property(c => c.Id) .HasDefaultValueSql("nextval('\"ChairsIds\"')");
Комментариев нет:
Отправить комментарий