5

我有一个数据库表,我不能改变包含了像数据:功能NHibernate - 拼合多个行成一个单一的实体

FooTable 
Id  | EntityAUniqueId | EntityBUniqueId | EntityCUniqueId 
============================================================ 
1  | A1    | B1    | C1 
2  | A1    | B1    | C2 
3  | A1    | B2    | C3 
4  | A1    | B2    | C4 
5  | A2    | B3    | C5 
6  | A2    | B3    | C6 
7  | A2    | B4    | C7 
8  | A2    | B4    | C8 

我想这个映射到以下结构:

interface IEntityA 
{ 
    string UniqueId { get; } 
    IEnumerable<IEntityB> { get; } 
} 

interface IEntityB 
{ 
    string UniqueId { get; } 
    IEnumerable<IEntityC> { get; } 
} 

interface IEntityC 
{ 
    string UniqueId { get; } 
} 

class EntityA : IEntityA { ... } 
class EntityB : IEntityB { ... } 
class EntityC : IEntityC { ... } 

以上数据将导致以下实体被拉:

EnityA(A1) 
    |-EnityB(B1) 
    | |-EntityC(C1) 
    | |-EntityC(C2) 
    |-EnityB(B2) 
     |-EntityC(C3) 
     |-EntityC(C4) 
EnityA(A2) 
    |-EnityB(B3) 
    | |-EntityC(C5) 
    | |-EntityC(C6) 
    |-EnityB(B4) 
     |-EntityC(C7) 
     |-EntityC(C8) 

目前我只需要写入表中不能读取。

我使用FluentNHibernate与AutoMapping和约定。

我开始走下组件的道路,但意识到这不是他们的目的。一种可能的解决方案是在桌面上使用三个视图,但这会增加额外的问题,如果可能的话,我希望避免它,并且我不能帮助感觉框架中必须有某些东西来解决这个问题。

如果接口混淆了答案,请随时将其从解决方案中省略。

+0

不确定你想在这里实现什么;你能解释为什么你有EntityA/B/C的集合吗?根据你的例子,似乎每个UniqueId只有一行数据连接到它。还是有其他表格在这里没有提到? – 2011-04-11 07:41:26

+0

@sJhonny我已经更新了这个问题 – Bronumski 2011-04-12 17:20:11

回答

1

所以你已经非规格化数据在你的表中。我不知道如何处理它与你要求的那种映射。我可以考虑两种解决方法。

1)在数据库中创建视图以规范化数据,并为这些视图创建映射。像

ViewEntityA 
----------- 
IdColumn: EntityAUniqueId 
AnyDataColumns 

ViewEntityB 
----------- 
IdColumn: EntityBUniqueId 
FkColumn: EntityAUniqueId 
AnyDataColumns 

ViewEntityC 
----------- 
IdColumn: EntityCUniqueId 
FkColumn: EntityBUniqueId 
AnyDataColumns 

视图您可以接着写视图插入/更新/删除触发逻辑(Reference1Reference 2)来处理NHibernate的更新。

2)按原样映射表。手动映射到C#中的.net对象层次结构。更新所有数据库表,而不使用NHibernate的实体关系。

+0

自从我发布这个已经很长时间了,我不再在公司工作了。我认为我们使用了类似于选项2的东西,但该视图将是一个合适的解决方案,虽然我真的是一个本地的流利NHibernate映射。 – Bronumski 2012-04-30 08:38:11

相关问题