使用相同类型的对象访问不同的表(NHibernate,C#)

时间:2015-01-13 19:33:38

标签: c# nhibernate

我在处理NHibernate时遇到了一些问题。我能够解决大多数在互联网上搜索的问题(主要是在StackOverflow上),但这个我无法解决。

我在同一个类创建的数据库中有两个不同的表。

public class Person
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual int Age { get; set; }
}

表名分别是“Person”和“TestTable”。但是当我想向“TestTable”添加内容并使用下面的代码时,它仍然会在“Person”表中添加我想要添加的内容。 任何人都知道如何解决这个问题?

    public bool Add( string entity_name, T product )
    {
        using ( ITransaction transaction = Session.BeginTransaction() )
        {
            Session.Save( entity_name, product );
            transaction.Commit();
        }

        return true;
    }

1 个答案:

答案 0 :(得分:1)

好的,伙计们,所以我不得不拖延一点我承诺的回应,因为它不会正常工作。经过一整天的工作,现在我有一些有趣的事情与你分享。

更确切地说,我的问题确切地说是:我有一个访问数据库的系统,在我的数据库中我希望: - 静态表
- 动态表。

为什么我要动态表?我可以给你们一个例子:如果我想记录每个人在我的应用程序中做了什么,我想以一种方式来做,即使很多日志都在我的数据库中,它也不会最终可扩展(查询中有很多条件,要在一个表中过滤大量数据),我必须每个用户日志一个表

静态表将是其他的,就像我上面描述的类。

在NHibernate中,没有一种简单的方法可以做到这一点。他们想要将一个类和一个映射映射到一个表中,这就是它。如果你想做任何其他事情,那么你必须愚弄库。这就是我最终做的事情:

在一个Library项目中,我创建了一个这样的静态表:

  public class GenericTableInfo
    {
        public virtual string name { get; set; }
        public virtual int id { get; set; }
    }

在同一个Library项目中,我的动态表有一个类(和xml,但我不会将XML添加到这个项目中),就像这样:

    public class DynamicPeople
{
        public virtual int id { get; set; }
        public virtual string log { get; set; }
}

当我第一次生成我要执行的查询时,使用我上面描述的库的程序集,NHibernate将创建静态表(具有XML和Class的那些),并且不会创建与之相关的表。我的DynamicPeople课程。

在名为AddTable()的服务中,我必须执行以下操作: - 1.在GenericTableInfo中添加表名(更准确的实体名称);

    1. 获取GenericTableInfo中包含的所有名称(因此,我在数据库中创建的所有动态表格);
    1. 创建一个这样的会话:
    2. public static ISession AddTable(string TableName,List TableNames,Databases db) {

      if ( !SessionFactories.ContainsKey( db ) )
      {
          SessionFactories.Add( db, null );
      }
      var _cfg = new Configuration();
      _cfg.Configure( System.IO.Path.Combine( DatabaseConfigurationFiles[db] ) );
      // Add table to the database
      File.Move( @"C:\Generic.hbm.xml", @"C:\" + TableName + ".hbm.xml" );
      string aux = File.ReadAllText(@"C:\" + TableName + ".hbm.xml");
      aux = aux.Replace("generic", TableName);
      File.WriteAllText( @"C:\" + TableName + ".hbm.xml", aux );
      _cfg.AddFile(@"C:\" + TableName + ".hbm.xml");
      var update = new SchemaUpdate( _cfg );
      var sb = new StringBuilder();
      TextWriter output = new StringWriter( sb );
      update.Execute( true, true );
      aux = aux.Replace( TableName, "generic" );
      File.WriteAllText( @"C:\" + TableName + ".hbm.xml", aux );
      File.Move( @"C:\" + TableName + ".hbm.xml", @"C:\Generic.hbm.xml" );
      // Add dynamic tables to my mappings list.
      if ( SessionFactories[ db ] == null )
      {
          var configuration = new Configuration();
          configuration.Configure( DatabaseConfigurationFiles[ db ] );
          configuration.AddAssembly( Assembly.GetExecutingAssembly() );
          string filename = @"C:\Generic.hbm.xml";
          string entityname = "generic";
          string a = "";
          for ( int i = 0 ; i < TableNames.Count() ; i++ )
          {
              File.Move( filename, @"C:\" + TableNames[ i ] + ".hbm.xml" );
      
              filename = @"C:\" + TableNames[ i ] + ".hbm.xml";
              a = File.ReadAllText( filename );
      
              a = a.Replace( entityname, TableNames[ i ] );
              entityname = TableNames[ i ];
              File.WriteAllText( filename, a );
              configuration.AddFile( filename );
              configuration.ClassMappings.Last().EntityName = entityname;
              configuration.ClassMappings.Last().Table.Name = entityname;
              configuration.ClassMappings.Last().DiscriminatorValue = entityname;
          }
          File.Move( filename, @"C:\Generic.hbm.xml" );
          filename = @"C:\Generic.hbm.xml";
          a = File.ReadAllText( filename );
          entityname = TableNames.Last();
          a = a.Replace( entityname, "generic" );
          File.WriteAllText( filename, a );
      
          SessionFactories[ db ] = configuration.BuildSessionFactory();                
      }
      else
      {
          DBStub.CloseSession( db );
          return DBStub.OpenSession( db, TableNames );
      }
      return SessionFactories[ db ].OpenSession();
      

      }

(很抱歉第一行和最后一行未被识别为代码,我在StackOverflow上是一个菜鸟,它只是不想将这些行识别为代码。:()

修改我的配置通过更改我的xml实体名称手动添加我的映射,我的映射实体名称和表名将愚弄库,因此它不知道它是相同的xml,因此,不一样的映射。

这样,当使用NHibernates函数查询它们时,您可以使用其实体名称作为键来查找表。然后,它们将全部映射到同一个类(在此示例中,它们将全部映射到DynamicPeople)。

我没有看到其他人成功尝试这一点,所以今天我的社区是2美分。如果有任何人有任何疑问,请不要犹豫。 :)