首页 新闻 会员 周边

EF 表结构完全一样,表名不同,如何处理?

0
悬赏园豆:100 [待解决问题]
  1. 比如我有goods_1,goods_2......goods_1000这样的表,他们的结构完全一样,表名的后缀是根据表中某个字段来生成----伪代码如下:goods_{0}.fmt(ownerid/1000);
  2. 如果按常规的生成,EF会生成N多这样的实体,实际使用时也不方便
  3. 目标:只生成一个goods实体,在执行SQL时根据ownerid来确定表名,EF6现在有这样的功能么?

 

这个能实现么?

EF
问题补充:

//now it is this
var g = db.Goods_1.First();

//i want this
var g=db.Goods(ownerid).First();

 -------------------------我是分割线----下边的思路可行?------------------------------------

        //修改T4模板,生成goods类做为基类
        //goods_1:goods
        //goods_2:goods
        public virtual DbSet<Goods> Goods(int ownerId) {

            var nm = ownerId / 10000 + 1;

            var className = string.Format("Goods_{0}", nm);

            //load type goods_1
            Type tp = LoadType(className);

            Type dbSetTp = typeof(DbSet<>).MakeGenericType(tp);

            return System.Activator.CreateInstance(dbSetTp) as DbSet<Goods>;
        }

程小王的主页 程小王 | 初学一级 | 园豆:106
提问于:2015-01-06 17:54
< >
分享
所有回答(7)
0

对于这种情况,你可以考虑自己解析Expression。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-01-06 17:59
0

在配置映射关系时可以指定表名:

modelBuilder.Entity<Good>().ToTable("表名");

可以考虑通过你的DbContext的构造函数参数传递表名。

dudu | 园豆:31003 (高人七级) | 2015-01-06 18:06

你这是CodeFirst吧,DbFirst也能这样?

支持(0) 反对(0) 程小王 | 园豆:106 (初学一级) | 2015-01-06 18:29

@程小王: 是Code First

支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2015-01-06 19:51
0

   public virtual DbSet<Goods> Goods(int ownerId) {

            var nm = ownerId / 10000 + 1;

            var className = string.Format("Goods_{0}", nm);

            //load type goods_1
            Type tp = LoadType(className);

            Type dbSetTp = typeof(DbSet<>).MakeGenericType(tp);

            return System.Activator.CreateInstance(dbSetTp) as DbSet<Goods>;
        }

程小王 | 园豆:106 (初学一级) | 2015-01-08 13:19
0

请问楼主这个问题现在解决了没,我现在也遇到了同样的困惑,能否给我解答一下

脑子是个好东西cq | 园豆:204 (菜鸟二级) | 2015-10-27 14:14

没有,用dapper搞了

支持(0) 反对(0) 程小王 | 园豆:106 (初学一级) | 2015-10-27 14:25
0

楼主 请问下这个问题你解决了么?  能共享下解决方案么?

以沫浅夏 | 园豆:214 (菜鸟二级) | 2016-02-19 15:17

没有

支持(0) 反对(0) 程小王 | 园豆:106 (初学一级) | 2016-02-19 15:30
0

我正好也遇到同样的问题,我是这样解决的:直接使用SQL语句,代码类似下面这样,SQL中的表名(goods_1000)你可以根据需要进行动态的生成!

using (var dbContext = new PubDbContext())
{
    var begParam = new System.Data.SqlClient.SqlParameter
    {
        ParameterName = "@beg",
        Value = beg
    };
    var endParam = new System.Data.SqlClient.SqlParameter
    {
        ParameterName = "@end",
        Value = end
    };
    var temList = dbContext.goods.SqlQuery("select * from goods_1000 where cretattime>=@beg and cretattime<=@end order by cretattime desc"
        , begParam, endParam).ToList();
    return temList;
}

希望上面的代码能帮助到你~

 

relax | 园豆:113 (初学一级) | 2016-04-11 19:41
0

http://entityframework.codeplex.com/wikipage?title=Public%20Mapping%20API

 

[Table("MyTable")]
public class Entity
{
public int Id { get; set; }
public string Description { get; set; }
}

 

官网的例子,  约定优于配置, 所以不要想配置文件的事情了

viewcozy | 园豆:202 (菜鸟二级) | 2016-09-01 11:40

这位是正解。

支持(0) 反对(0) yuxianp | 园豆:200 (初学一级) | 2022-12-16 11:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册