2011-09-29 85 views
0

问题是试图映射现有表结构的继承。该表还被传统应用程序使用原始sql使用,即该表不能删除任何现有的模式细节,但可以添加更多。如何将现有表映射到NHibernate中的继承层次结构?

现有表已被映射,并且基本上具有一堆具有以下问题字段....

所以现有的类

class A 
{ 
    // Id etc 
    public virtual Client Client { get; set; } 
} 

与像

table A (
     Id INT IDENTITY NOT NULL, 
     Client_id INT null, 
     primary key (Id) 
    ) 
表结构

现在我想介绍一个基类

class Base 
{ 
    // Id etc 
    public virtual Client Client { get; set; } 
} 

这将结束与一个表像...

table Base (
     Id INT IDENTITY NOT NULL, 
     Client_id INT null, 
     primary key (Id) 
    ) 

和更改

class A : Base 
{ 
    // clients moved to the base... 
} 

这将做这样的事情表: -

table A(
      Base_id INT IDENTITY NOT NULL, 
      Id INT not null,  // I will need to keep the existing Id field... 
      Client_id INT null, // this Client now conflicts with the Base client 
      primary key (Base_id) 
     ) 

我使用每个类继承的表。

问题是....

“客户”将是“基地”的表,也这是对“A”的现有表。我希望能够继续使用“A”上的“客户端”作为一种覆盖。

我该怎么做?我可以这样做吗?

还是有可能在表“基地”它根本没有'客户端',然后在他们定义“客户端”的所有子类表上? (这将使查询有趣)

+0

这整个“A”“基地”支持查询“客户”真的让你的问题很难理解我。你能提供一个你的表结构和类的减少版本吗?将更容易确定映射要求是什么。 – Phill

+0

试图使它更清晰:-)基本问题是客户端出现在两个表中的字段,通常当你的子类只有基地。至少就我的理解而言。 –

+0

嗯,客户端真的不会继承,如果你有客户端的基础上,它在子表上有什么不同。如果你将基地4存放在基地上,并且用基地层级中的客户端7'覆盖'它,那么基地如何更新为7呢?我不认为基地真的被用作“基地”,更像是自己的基地。 – Phill

回答

0

如果仅用于查询NH应由接口

class A : IHasClient 
{ 
    // Id etc 
    public virtual Client Client { get; set; } 
} 

class SomeOther : IHasClient 
{ 
    // Id etc 
    public virtual Client Client { get; set; } 
} 


var classesWithClients = session.QueryOver<IHasClient>().List(); 
+0

和集合,我也想把东西放在IList 类型的东西里 –