当前位置: 首页 > 知识库问答 >
问题:

实体框架代码优先动态映射

白坚壁
2023-03-14

因此,我使用实体框架的“代码优先”方法,并且我有映射文件来映射表信息并添加诸如验证之类的内容,例如:

this.Property(t => t.AccountName)
            .IsRequired()
            .HasMaxLength(25);

这是在使用Fluent API,我想知道如何通过字符串而不是T.AccountName获得属性名。我想动态设置这些属性,但我不知道如何通过编程实现。

共有1个答案

汪胤
2023-03-14

无需评论这是否可取(!),您就可以实现所需的,因为Property()方法将表达式树作为其参数。请考虑以下内容:

public class MyEntity
{
    [Key]
    public int MyEntityId { get; set; }

    public string MyProperty { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyEntities
    {
        get { return this.Set<MyEntity>(); }
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        var param = Expression.Parameter(typeof(MyEntity));

        var propertyExpression = Expression.Lambda(Expression.Property(param, "MyProperty"), param);

        modelBuilder.Entity<MyEntity>()
            .Property((Expression<Func<MyEntity, string>>)propertyExpression)
            .HasColumnName("Fish");
    }
}

这里,我为myproperty列构建配置,我在lambda表达式中通过名称引用该列。

上面的代码适用于string属性,但需要进行一些修改才能适用于任何属性类型。转换为expression > 对属性类型进行了硬编码,但我们可以使用动态语言特性消除转换。

        var param = Expression.Parameter(typeof(MyEntity));
        dynamic propertyExpression = Expression.Lambda(Expression.Property(param, "MyProperty"), param);

        modelBuilder.Entity<MyEntity>()
            .Property(propertyExpression)
            .HasColumnName("FishFace");
 类似资料:
  • 问题内容: 我想建立这样的关系(一个区域在x个其他区域的附近) 不幸的是,这是行不通的,因为EF生成的FK不正确…我如何才能使像这样的结构起作用? 3个区域的示例:3 Zones: Zone 1, Zone 2, Zone 3 Zone 1 Neighours: Zone 2, Zone 3 Zone 2 Neighbours: Zone 1 Zone 3 Neighbours: Zone1 有什

  • 好吧,我知道我对C#和MVC还很陌生,但我正在尝试使用代码优先的方法向数据库中添加项。 现在,我已经成功地为数据库创建了新条目,但当我转到SQL Server时,却找不到数据库或表。 因此,我的问题是,这些数据存储在哪里,因为我无法在SQL Server中看到它,就像我手动创建的其他数据库一样? 我的ConnectionString是:

  • 我对Entity Framework 6非常陌生,我想在我的项目中实现存储过程。我有一个存储过程,如下所示: 班级: 我的问题是:如何调用存储过程并向其中传递参数?

  • 问题内容: 我首先在我的项目中使用EF代码。我的DataModel中有以下代码 为了使该值不为空,我删除了“?” 并从“程序包管理器”控制台中运行“添加迁移”命令。以下迁移文件已生成。 但是当我运行Update-Database命令时: 我收到以下错误:无法将值NULL插入表“’‘的“ PasswordDate”列中;列不允许为空。UPDATE失败。该语句已终止。 请提出解决方案。 问题答案: 那

  • [将代码优先DbContext与实体框架5.0 RC一起使用] DbUpdateException:更新条目时出错 我需要能够将这些父类保存到数据库中,因为它们是唯一的,即使它们有时包含已存储的导航属性-我如何从这个子主键冲突中保存父类?

  • 问题内容: 在这些多重性冲突中,我所看到的大多数其他问题都是代码优先的,而我将DB作为第一位。我进行了一些模式更改,并且从数据库刷新模型时出现以下错误: 多重性与关系“ FK_MarketSelectionWager_Bet”中的角色“赌注”中的引用约束冲突。由于从属角色中的所有属性都是不可为空的,因此,主体角色的多重性必须为“ 1”。 我需要在SQL或模型中进行修复的任何指针都很棒。 以下是涉及