Прежде всего, скажите Entity Framework, что вы сгенерируете значение первичного ключа: Используйте DatabaseGenerated Attribute
public class School
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Name {get; set;}
...
}
Параметр None предотвращает создание значений базой данных. автоматически в тех случаях, когда они будут созданы в противном случае.
Кроме того, рассмотрите возможность перезаписи DbContext.SaveChanges (). В этой процедуре запросите ChangeTracker для всех добавляемых элементов. Генерация идентификатора для каждого добавленного элемента. Может быть опасно позволить другим генерировать Id, потому что они могут добавлять постоянное значение или просто автоинкремент.
Другой возможностью было бы сгенерировать ее в функции Add, но если вы это сделаете, пользователи могут изменить ваш сгенерированный Id. Таким образом, правильное место в SaveChanges:
public override int SaveChanges()
{
var addedElements = this.ChangeTracker.Entries
.Where(entry => entry.State == EntityState.Added);
foreach(var addedElement in addedElements)
{
// This will fail: the added element doesn't have a property Id:
addedElement.Id = GenerateId();
}
return base.SaveChanges();
}
Для этого вы должны быть уверены, что у каждого добавленного элемента есть свойство Id. Самый простой способ - создать интерфейс и позволить всем вашим таблицам реализовать этот интерфейс:
public interface IID
{
string Id {get; set;}
}
public class School : IID {...}
public class Student : IID {...}
public class Teacher : IID {...}
public class DbContext
{
public DbSet<School> Schools {get; set;}
public DbSet<Student> Students{get; set;}
public DbSet<Teacher> Teachers {get; set;}
public override int SaveChanges()
{
var addedElements = this.ChangeTracker.Entries.Cast<IID>
.Where(entry => entry.State == EntityState.Added);
foreach(var addedElement in addedElements)
{
addedElement.Id = GenerateId(); // Every Added element implements IId
}
return base.SaveChanges();
}
private string GenerateId()
{
... // TODO: return unique ID, for instance a GUID
}
}