Entity framework 如何将实体框架模型动态映射到表名

Entity framework 如何将实体框架模型动态映射到表名,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,使用代码优先的方法,我希望动态地将单个模型映射到多个表名。目前,我可以执行类似于modelBuilder.Entity(Of Person)(.MapSingleType().ToTable(“Managers”)的操作,但由于OnModelCreating方法只有在调用时才会被调用,因此我无法动态地将其映射到其他表名 在我们当前的LinqToSql版本中,我们覆盖了MetaModel.GetTable()并返回了一个新的TableAttribute和我们的动态名称。我还没有在EF中找到这样的属

使用代码优先的方法,我希望动态地将单个模型映射到多个表名。目前,我可以执行类似于
modelBuilder.Entity(Of Person)(.MapSingleType().ToTable(“Managers”)
的操作,但由于
OnModelCreating
方法只有在调用时才会被调用,因此我无法动态地将其映射到其他表名

在我们当前的LinqToSql版本中,我们覆盖了MetaModel.GetTable()并返回了一个新的TableAttribute和我们的动态名称。我还没有在EF中找到这样的属性(即使有,我也不知道如何覆盖它)。所以我的问题是:有可能做到这一点吗

更新 我发现我可以通过调用

modelBuilder.CacheForContextType = false;
因此,我可以在对象实例化时分配表定义。这不是我想要的方式,但它是有效的

更新 哦,天哪,上面的是一个大错误吗……缓存的存在是有原因的!:)现在我回到POCO对象映射的第一步。如果我找到了解决方案,我会发布更新

最终的
如果有人关心我目前是如何解决这个问题的,那么给你:

首先,我用POCO表和接口创建了一个单独的库

public interface IDataContext {
    System.Data.Entity.DbSet<TableGeneric> TableGeneric { get; set; }

    int SaveChanges();
}


public class TableGeneric {
    [Key]
    public int Column1 { get; set; }
    public string Column2 { get; set; }
    public DateTime Column3 { get; set; }
    public string Column4 { get; set; }
    public string Column5 { get; set; }
}
public interface IDataContext {
    System.Data.Entity.DbSet<TableGeneric> TableGeneric { get; set; }

    int SaveChanges();
}


public class TableGeneric {
    [Key]
    public int Column1 { get; set; }
    public string Column2 { get; set; }
    public DateTime Column3 { get; set; }
    public string Column4 { get; set; }
    public string Column5 { get; set; }
}

然后剩下的就好像你有一个正常的DataContext。希望这对其他人有所帮助。

如果有人关心我目前是如何解决这个问题的,给你:

首先,我用POCO表和接口创建了一个单独的库

public interface IDataContext {
    System.Data.Entity.DbSet<TableGeneric> TableGeneric { get; set; }

    int SaveChanges();
}


public class TableGeneric {
    [Key]
    public int Column1 { get; set; }
    public string Column2 { get; set; }
    public DateTime Column3 { get; set; }
    public string Column4 { get; set; }
    public string Column5 { get; set; }
}
public interface IDataContext {
    System.Data.Entity.DbSet<TableGeneric> TableGeneric { get; set; }

    int SaveChanges();
}


public class TableGeneric {
    [Key]
    public int Column1 { get; set; }
    public string Column2 { get; set; }
    public DateTime Column3 { get; set; }
    public string Column4 { get; set; }
    public string Column5 { get; set; }
}

然后剩下的就好像你有一个正常的DataContext。希望这对其他人有帮助。

最好将您的解决方案添加为答案并接受它。好主意……我希望其他人能过来更好地回答:)对此解决方案非常感兴趣!你能再解释一下你的DataContext类吗?特别是你的.Entity在做什么,以及ModelBuilder是什么……是的,我意识到这是很旧的,代码非常旧。回顾过去,这是一个非常糟糕的主意——我们已经与另一家供应商合作完成了我们需要的工作。虽然较新版本的EF可能会处理此问题。@BuildStarted您使用了什么提供程序?我能看看你的最终解决方案吗,比如博客帖子或其他答案?谢谢这已经过期很久了,不再有效,@FooBar。自那时以来,实体框架进行了多次修订。
class DataContext : System.Data.Entity.DbContext, IDataContext {
    public System.Data.Entity.DbSet<TableGeneric> TableGeneric { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        modelBuilder
            .Entity<ContextTesting.Interfaces.EF.TableGeneric()
                .MapSingleType()
                .ToTable("$TableName$");
    }
}
Type typeAccountants = BuildContext.CreateGenericTable("Accountants");
IDataContext context = (IDataContext)Activator.CreateInstance(typeAccountants);