我有一个我无法更改的数据库表,其中包含以下数据:
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 :(得分:1)
所以你在表中有非规范化数据。我不知道如何使用您要求的映射来处理它。我可以想到2个解决方案。
1)在数据库中创建视图以规范化数据,并针对这些视图创建映射。像
这样的观点ViewEntityA ----------- IdColumn: EntityAUniqueId AnyDataColumns ViewEntityB ----------- IdColumn: EntityBUniqueId FkColumn: EntityAUniqueId AnyDataColumns ViewEntityC ----------- IdColumn: EntityCUniqueId FkColumn: EntityBUniqueId AnyDataColumns
然后,您可以编写视图插入/更新/删除触发器逻辑(Reference1,Reference 2)来处理NHibernate更新。
2)按原样映射表格。手动映射到C#中的.net对象层次结构。在不使用NHibernate的实体关系的情况下更新所有数据库表。