我通过创建DateCreated
类向每个实体添加了UserCreated
,DateModified
,UserModified
和BaseEntity.cs
字段。我的要求是生成一个具有base
类的所有字段作为列的单个表。
public class BaseEntity
{
public DateTime? DateCreated { get; set; }
public string UserCreated { get; set; }
public DateTime? DateModified { get; set; }
public string UserModified { get; set; }
}
这是我的Student
班
public class Student : BaseEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
这是我的上下文课程
public class SchoolContext: DbContext
{
public LibraContext(DbContextOptions<SchoolContext> options)
: base(options)
{ }
public DbSet<Student> Students { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//CreatedDate
modelBuilder.Entity<BaseEntity>().Property(x => x.DateCreated).HasDefaultValueSql("GETDATE()");
//Updated Date
modelBuilder.Entity<BaseEntity>().Property(x => x.DateModified).HasDefaultValueSql("GETDATE()");
}
我已经运行以下迁移命令来创建脚本和更新数据库
Add-Migration -Name "InitialMigration" -Context "SchoolContext"
update-database
它已在SQL Server数据库中创建了单独的表BaseEntity
和Student
。我的期望是创建一个包含所有Student
字段作为列的单个BaseEntity
表。
如何实现?
我正在使用ASP.NET CORE2.1
答案 0 :(得分:2)
根据Microsoft Documentation,您可以使用[NotMapped]
数据注释或modelBuilder.Ignore<TEntity>();
来忽略BaseEntity
的表创建,如下所示:
但是在您的情况下,[NotMapped]
不能为您提供帮助,因为Fluent API
始终具有比数据注释(属性)更高的优先级。因此,您可以在modelBuilder.Ignore<BaseEntity>();
的{{1}}配置之后调用BaseEntity
,但是调用OnModelCreating
会丢失modelBuilder.Ignore<BaseEntity>();
配置。
因此,据我所知,最佳解决方案如下:
编写BaseEntity
的配置,如下所示:
BaseEntity
然后按如下所示编写public class BaseEntityConfigurations<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntity
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
//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
// other configurations here
}
}
中进行如下操作:
OnModelCreating
迁移将生成唯一具有protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new StudentConfigurations());
}
配置的Student
表,如下所示:
BaseEntity
答案 1 :(得分:0)
TPC模式当前位于backlog上,这意味着正在考虑将其作为功能部件包括在内,但尚未设置日期。
答案 2 :(得分:0)
我已经通过简单的更改解决了该问题!我们必须在<add binding="basicHttpsBinding" scheme="https" bindingConfiguration="basicHttpBinding_eLink" />
中使用Student
实体。我被误用了modelbuilder
BaseEntity
未解决的问题: protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(x => x.Created).HasDefaultValueSql("GETDATE()");
modelBuilder.Entity<Student>().Property(x => x.Updated).HasDefaultValueSql("GETDATE()");
}
无法控制生成的表列的顺序。 .net核心当前不支持此功能。