【问题标题】:Dynamic table name with entity framework带有实体框架的动态表名
【发布时间】:2015-06-24 19:23:17
【问题描述】:

我有许多表具有相同的模型结构,但其他表名和其他数据(在这种情况下将是约 100 个表)。我想在运行时使用实体框架动态切换表名(例如从路由中获取名称表)。数据库中的表是由其他脚本动态添加和删除的。有没有办法做到这一点,而且性能很好?

db.Table("TableName")<SpecificModel>.Where(x => x.ID == ID)

【问题讨论】:

  • 我不禁想知道您为什么不将表格规范化为一张表格?如果它们都是相同的结构...
  • 最简单的方法就是规范化,但我不能在这个项目中做到这一点。表格需要分开
  • 为了做你想做的事,你需要用创建的表的新元数据更新你的 edmx 文件。我不知道在运行时执行此操作的方法,因为更新 edmx 文件需要重新构建,因为会生成新代码。我认为实体框架目前不支持你正在尝试做的事情。
  • 你能给我们一个正在创建的表的例子吗?每个表之间的数据是否发生了根本变化?每个表的意义是什么,即每个表代表什么?
  • 表结构与每个表的模型(之前称为“SpecificModel”)相同。它们的不同之处在于表名,如“Company_A”、“Company_B”、“Company_C”和此表中的数据,但结构不同。当然,我可以在这里粘贴所有带有 sql 脚本的模型以生成表(从 EF Code First 中获取),但我认为这没有必要,并且可以模糊我的问题的重点

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

你想这样做吗?

foreach (string tableName in new[] { "Table1", "Table2" })
{
   var result = dbContext.Database.SqlQuery<SpecificModel>(string.Format("SELECT * FROM {0} WHERE ID=@p0", tableName), 1).FirstOrDefault();
}

【讨论】:

  • 它工作得很好,但它仍然是查询。有没有办法用 LINQ 做到这一点?
  • 是的,我认为我们可以在 LINQ 中使用反射和表达式来做到这一点,但是一旦我让你知道就不会复杂了。在实体框架中,最后 linq 表达式将转换为 sql 查询,所以没有更多的区别。使用此方法还 EF 将您的数据映射到类对象(SecificModel)对:)
  • 这将允许sql注入。
  • 这行不通。因为表是动态创建的,并且不会有 EF 知道的返回类型的 SpecificModel。
  • @tdbeckett,如果没有办法通过Linq实现需求,那么我们必须使用这种方法,我们需要正确验证输入字符串以避免sql注入。
【解决方案2】:

我做了这样的事情。 http://nodogmablog.bryanhogan.net/2013/08/entity-framework-in-an-dynamics-nav-navision-envirnoment/

我有相同的表,但它们的名称不同。例如,一个客户表,但不同公司的前缀不同。

[ACME$Customer] 
[SuperCorp$Customer]

我最终使用了动态编译。这是一篇非常详细的博文,所以我不会在这里详细介绍。

【讨论】:

  • 你知道这对除了名称不同之外不完全相同的表的处理效果如何吗?
【解决方案3】:

你可以这样做:

        // Gets entity type from specified namespace/assembly
        Type entityType = Type.GetType(string.Format("Your.NameSpace.{0},{1}", entityName, "Assembly.Name"));
        // Finds item to update based on its primary key value
        var entity = _dbContext.Find(entityType, entityKey);
        // Finds column to update preference for
        PropertyInfo propertyInfo = entity.GetType().GetProperty(entityField);
        // Set and update (date example given)
        propertyInfo.SetValue(entity, isOptIn ? (DateTime?)null : (DateTimeOffset?)DateTime.Now, null);
        _dbContext.SaveChanges();

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2015-02-13
    • 2015-12-26
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多