代码之家  ›  专栏  ›  技术社区  ›  Buildstarted

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

  •  20
  • Buildstarted  · 技术社区  · 14 年前

    使用代码优先的方法,我想将一个模型映射到多个表名 动态 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; }
    }
    

    然后,我使用CSharpCodeProvider创建了一个类,该类采用以下模板并将其转换为类型定义:

    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);
    

    剩下的就好像你有一个普通的DataContext。希望这能帮助别人。

    1 回复  |  直到 14 年前
        1
  •  15
  •   Buildstarted    14 年前

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

    首先,我用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; }
    }
    

    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);
    

    剩下的就好像你有一个普通的DataContext。希望这能帮助别人。