问答

c# – GetEntityTypes:使用EF Core中的.Property的通用版本配置实体属性

 来源    2019-07-27    1  

在我的EF核心项目中,我有一些从基类DBEntity继承的实体:

public abstract class DBEntity
{
    public int Id { get; set; }

    public DateTime CreatedOn { get; set; }

    public DateTime UpdatedOn { get; set; }

    public EntityStatus EntityStatus { get; set; }
}

我想为从DBEntity继承的每个实体设置一些具有默认值的特定属性.目前我正在使用此代码:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        var entities = modelBuilder.Model
            .GetEntityTypes()
            .Where(w => w.ClrType.IsSubclassOf(typeof(DBEntity)))
            .Select(p => modelBuilder.Entity(p.ClrType));

        foreach (var entity in entities)
        {

            entity
                .Property("CreatedOn")
                .HasDefaultValueSql("GETDATE()");

            entity
                .Property("UpdatedOn")
                .HasComputedColumnSql("GETDATE()");

            entity
                .Property("EntityStatus")
                .HasDefaultValue(EntityStatus.Created);

        }
    }

这工作正常,但我不想使用字符串常量指定属性名称(对于重构等不好).

有没有办法循环从DBEntity继承的实体并使用属性表达式配置默认值,如下所示:

foreach (var entity in entities)
{
    entity
      .Property(k => k.CreatedOn)
      .HasDefaultValueSql("GETDATE()");

// ....

}

重要的约束:我不能直接调用modelBuilder.Entity().Property(k => k.CreatedOn),因为它会搞乱所有表.

正如评论中所指出的,你可以简单地用nameof(DBEntity.CreatedOn)等替换字符串常量.

但是,如果要使用类型化访问器,可以将基本实体配置代码移动到泛型方法(泛型参数是实际实体类型)并通过反射调用它.

例如,将以下内容添加到DbContext派生类:

static void ConfigureDBEntity<TEntity>(ModelBuilder modelBuilder)
    where TEntity : DBEntity
{
    var entity = modelBuilder.Entity<TEntity>();

    entity
        .Property(e => e.CreatedOn)
        .HasDefaultValueSql("GETDATE()");

    entity
        .Property(e => e.UpdatedOn)
        .HasComputedColumnSql("GETDATE()");

    entity
        .Property(e => e.EntityStatus)
        .HasDefaultValue(EntityStatus.Created);

}

然后使用这样的东西:

var entityTypes = modelBuilder.Model
        .GetEntityTypes()
        .Where(t => t.ClrType.IsSubclassOf(typeof(DBEntity)));

var configureMethod = GetType().GetTypeInfo().DeclaredMethods.Single(m => m.Name == nameof(ConfigureDBEntity));
var args = new object[] { modelBuilder };
foreach (var entityType in entityTypes)
    configureMethod.MakeGenericMethod(entityType.ClrType).Invoke(null, args);
asp.net – 如何在EF Core中向Identity用户添加外键?
问答假设我在EF生成的数据库中具有带有相应Todo表(DbSet)的Todo模型.该表将每行存储待办事项.每个用户(在ASP.NET核心身份IdentityServer应用程序中)将与多个待办事项关联(一 ...
c# – 拥有的类型属性不存在于EF Core中的已修改实体
问答我正在尝试在EF Core中实现一些在EF 6中非常适合我的东西. 我正在序列化List的内容.属性作为DB中的Json字符串. < T>可以是几乎任何东西,因为Json.Net负责序列化 ...
1
c# – 在EF Core中实现递归属性加载
问答我在.NET Core 1.1.0,EF Core 1.1.0,VS 2015上. 我正在编写一个帖子/评论系统,我需要一个函数来加载评论及其所有子项及其相关属性.这是我的课程的简化版本: publi ...
entity-framework-core – 在EF Core中包含过滤
问答我正在尝试过滤初始查询.我已经嵌套了包含模型的叶子.我正在尝试根据其中一个包含的属性进行过滤.例如: using (var context = new BloggingContext()) { var ...
1
c# – EF Core中是否有唯一约束的数据注释(代码优先)?
问答我想知道在Entity Framework Core 2代码第一种方法中是否存在唯一约束的数据注释?::在EF Core中您只能在流畅的API中使用扩展方法HasAlternateKey.没有数据注释 ...
3
c# – 如果模型在没有迁移的EF Core中发生更改,则删除数据库
问答在以前版本的实体框架中,如果模型发生更改,可以使用某些类DropDatabseIfModelChanges和其他相关类重新创建数据库. 在EF7或EF Core我不知道该怎么做.运行迁移有时会出现问题 ...
1
c# – EF Core中的多个Includes()
问答我有一个扩展方法,允许您在EF中一般包含数据: public static IQueryable<T> IncludeMultiple<T>(this IQueryable&l ...
1
c# – UPDATE语句与EF Core中的FOREIGN KEY约束冲突
问答我们有3个模型类: >主持人 > TournamentBatch > TournamentBatchItem 主持人有很多TournamentBatch. TournamentBat ...
1
entity-framework-core – 在EF Core中更改MigrationsHistoryTable列名
问答我在EF Core数据库中有一个标准化的所有表和列名称,以使用snake_case.我能够更改迁移历史记录表名称和架构以匹配数据库的其余部分,但我无法找到将MigrationId中的列更改为migra ...
1
entity-framework-core – 在EF Core中获取元数据:表和列映射
问答希望在EF Core中获取元数据,以使用对象的映射和属性到数据库表&列. 这些映射在DBContext.cs OnModelCreating()方法中定义,使用.ToTable()映射表,并通 ...
c# – 如何在EF Core中放弃对上下文的更改
问答我有一个巨大的json格式的"扁平"对象列表,以及一个有点复杂的关系数据库模式(大约有20个表对应于展平对象).我正在尝试在新的关系数据库中自动插入那些展平的对象: foreach ...
1
c# – 在EF Core中添加一对一关系时迁移数据?
问答在我的一个表中添加新的一对一关系后,我无法弄清楚如何为我的数据库中的现有行添加默认数据. 升级前我的数据库基本上看起来像这样: -- Team -- Name: TEXT -- History -- ...
1
entity-framework – EF Core中的表值函数
问答我正在使用EF Core 1.1并且有一个类似的查询 var list=from l in context.Users where l.SomeProp==someVal select l; 我有一个 ...
1
c# – 使用EF6语法在EF Core中加载相关实体
问答在EF6中,我们用来加载这样的相关实体: query // (A) .Include(q => q.Employee.Supervisor.Office.Address) .Include(q ...
c# – 在.Net Core / EF Core中设置多个同类的外键
问答我正在构建一个.Net Core Web应用程序,将旧的旧版Access ADP / ADE前端替换为项目管理SQL Server数据库.但是,原始数据库的构建器没有设置大量的外键关系,而是支持在SQ ...
1
c# – 0-1 EF Core中的自引用关系
问答想法:我有一个Key实体,可以被其他Key替换(轮换)延迟.我想把它实现为: class Key { string Id; string ReplacesId; Key Replaces; strin ...
2
c# – EF Core中的modelBuilder.Configurations.AddFromAssembly
问答在EntityFramework 6.x中,如果我们有很多EntityConfiguration类,那么我们可以在OnModelCreating(ModelBuilder模型构建器)中分配所有这些类, ...
c# – 如何在EF Core中添加自定义Add-Migration行为?
问答我的目标是创建一个自定义属性并允许.添加迁移以根据它生成自定义代码. Model和Attribute类 public class MyAttribute: Attribute {} public cl ...
1
c# – 尝试在EF Core中使用`ThenInclude`时出现异常
问答我正在使用Entity Framework Core和Repository Pattern,我遇到了一个问题. 我有课程客户,公司和电子邮件,隐藏与此无关的内容,如下所示: public class ...