Проблема заключается в том, что аннотация данных [Not Mapped]
не игнорирует создание таблицы, поскольку Fluent API
всегда имеет более высокий приоритет, чем аннотации данных (атрибуты). Таким образом, вы можете позвонить modelBuilder.Ignore<BaseEntity>();
после конфигурации BaseEntity
в OnModelCreating
, но вызов modelBuilder.Ignore<BaseEntity>();
потеряет настройки BaseEntity
.
Так что лучшим решением будет:
Запишите конфигурацию для BaseEntity
следующим образом:
public class BaseEntityConfigurations<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.Property(x => x.Key).HasDefaultValueSql("NEWID()");
//CreatedDate
builder.Property(x => x.DateCreated).HasDefaultValueSql("GETDATE()");
//Updated Date
builder.Property(x => x.DateModified).HasDefaultValueSql("GETDATE()");
}
}
Затем запишите конфигурацию для Student
следующим образом:
public class StudentConfigurations : BaseEntityConfigurations<Student>
{
public override void Configure(EntityTypeBuilder<Student> builder)
{
base.Configure(builder); // Must call this
// composite key
builder.HasKey(c => new { c.Key, c.Id });
}
}
Затем в OnModelCreating
следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new StudentConfigurations());
}
Теперь все должно работать нормально!
Примечание. Если у вас уже есть база данных, она не будет работать при миграции. Вы должны сгенерировать новую таблицу с начальной миграцией, потому что ядро Entity Framework не может изменить первичный ключ при миграции.