Свободная проблема отображения NHibernate - PullRequest
1 голос
/ 30 августа 2011

У меня проблемы с отображением базы данных с использованием Fluent NHibernate. База данных, над которой я работаю, коричневая, и некоторые отношения плохо реализованы.

Сопоставление, которое я пытаюсь сделать, описывается в следующих таблицах:

+----------+ +----------+ +---------------+  +-------------------+
| ToolA    | | ToolB    | | ToolPurpose   |  | ToolInstruction   |
+==========+ +==========+ +===============+  +===================+
| ToolA_Id | | ToolB_Id | | Purpose_Id    |  | ToolInstruction_Id|
| Name     | | Name     | | ToolA_Id      |  | Purpose_Id        |
+----------+ +----------+ | ToolB_Id      |  | Instruction       |
                          | Purpose       |  +-------------------+
                          +---------------+

Я хочу сопоставить таблицу ToolA с таблицей ToolInstruction, чтобы получить такой класс, как:

public class ToolA
{
    public virtual int _ToolA_id { get; set; }
    public virtual string _Name { get; set; }
    public virtual string _Instruction { get; set; }
}

OR

public class ToolA
{
    public virtual int _ToolA_id { get; set; }
    public virtual string _Name { get; set; }
    public virtual ToolInstruction _ToolInstruction{ get; set; }
}

public class ToolInstruction
{
    public virtual string _Instruction { get; set; }
}

Я думаю, что вызывает у меня затруднение то, что в таблице ToolPurpose есть строка для каждой записи ToolA и ToolB, так что для записи ToolA ToolB_Id равен нулю и наоборот.

Например:

+--------------------------------------------------+
|Purpose_Id | ToolA_Id | ToolB_Id | Purpose        |
|===================================================
|1          | 1        | null     | "purpose here" |
|2          | null     | 1        | "purpose here" |
+--------------------------------------------------+

Я попробовал несколько подходов к этому, и они показали признаки работы при использовании метода PersistenceSpecification.VerifyTheMappings (), но не при попытке извлечь данные из резервной базы данных, потому что я начинаю сталкиваться с исключениями нулевых ссылок.

Я попытался отобразить ToolPurpose как класс компоновщика, и я попытался отобразить его с помощью метода Join в классе отображения ToolA. Я также чередовал использование HasOne и HasMany, чтобы увидеть, какой из них подходит.

Я надеюсь, что кто-то может указать мне правильное направление, изложив, как они это сделают или увидят какие-то проблемы с точки зрения того, как я к нему подхожу.

Ответы [ 2 ]

1 голос
/ 31 августа 2011

вы можете использовать это для части вашего вопроса:

ToolA
------
ToolBs = new Dictionary<string, ToolB>();
public virtual IDictionary<string, ToolB> ToolBs { get; set; }

HasManyToMany<ToolB>(x => x.ToolBs)
                .Table("ToolPurpose")
                .ChildKeyColumn("ToolB_Id ")
                .ParentKeyColumn("ToolA_Id")
                .AsMap<string>("Purpose")
                .Cascade.All();
0 голосов
/ 01 сентября 2011

Я работаю без какой-либо документации для базы данных, которую я отображаю, и оказалось, что именно здесь возникла моя проблема.Отношение ToolPurpose к ToolA на самом деле является отношением много-к-одному, так что каждый инструмент имеет несколько целей, а отношение ToolPurpose-to-ToolInstruction также является отношением много-к-одному, так что каждая цель может иметь несколько связанных инструкций.Это означает, что для связывания таблиц ToolA, ToolPurpose и ToolInstruction могут использоваться прямые сопоставления HasMany () <-> References ().Нулевые значения в таблице ToolPurpose не влияют на сопоставления таким образом.

Я должен был упомянуть в своем посте открытия, что я просто извлекаю, а не обновляю или сохраняю в базу данных, поэтому мне не нуженполное отображение таблиц, поэтому мне не нужно отображать ToolB.

...