Свободный картографический компонент NHibernate с множеством и дополнительными полями - PullRequest
0 голосов
/ 09 ноября 2011

Я вращался в одном и том же месте, пытаясь решить эту проблему с помощью таблицы «многие ко многим» с дополнительными столбцами.Я поглощаю свою гордость и спрашиваю более опытных экспертов по Fluent NHibernate, не могли бы вы помочь здесь.

Я пытался использовать компонент для таблицы «многие ко многим», но, похоже, не могу найти, гдеуказать компонент, чтобы вызвать объединение на конкретном столбце.Я предполагаю, что до тех пор, пока я заполняю информационный объект завершения, наличие и использование компонента для меня не является обязательным.

Это моя упрощенная схема.

User
...................
Id
Name 

Task
...................
Id
Name


Job
...................
Id
Name

JobTask
...................
JobId
TaskId
CompletedByUserId
CompletionDate
CompletionNotes

Тогда у меня естьобъекты вроде так:

 public class Job
 {
    long Id { get; set; }
    IList<Task> Tasks { get; set; }
 }


 public class Task
 {
    long Id { get; set; }
    string Name { get; set; }
    CompletionInfo CompletionInfo { get; set; }
 }

 public class CompletionInfo
 {
    User User { get; set; }
    DateTime CompletionDate { get; set; }
 }

Можете ли вы помочь с вашими идеями, как реализовать это в беглом nhibernate?

У меня было это отображение раньше на JobMap, и оно будет работать, но только для многих-для многих столбцов (TaskId, JobId).Мне нужна дополнительная информация, относящаяся к этим отношениям (dateCompleted, userCompleted и т. Д.)

 HasManyToMany<Task>(job => job.Tasks)
            .Table(ManyToManyTable)
             .ParentKeyColumn("JobId")
            .ChildKeyColumn("TaskId")
            .Not.LazyLoad()
            .Cascade.Delete();

Чтобы упростить многие из многих, я подумал создать объект для представления отношений и инкапсулировать задачу,Примерно так: И я бы добавил прокси в задачу «Задача», чтобы изменить фактические свойства задачи.Но это никуда не денется.

Это должно быть что-то общее, я очень удивлен, что не так много по этому вопросу.Естественно, мне бы понравился способ расширить HasManyToMany, но я не уверен, каким образом, поэтому этот пост.

public class JobTask : Entity<long, JobTask>
{ 
    public virtual Job ParentJob { get; set; }

    public virtual Task Task   { set;set; }

    public virtual TaskCompletionDetails CompletionInformation
    {
        get
        {
            if (this.Task == null)
                return null;

            return Task.CompletionInformation;
        }

        set
        {
            if (this.Task == null)
                return;

            this.Task.CompletionInformation = value;
        }
    }


    public virtual string CompletionNotes
    {
        get
        {
            if (this.Task == null || this.Task.CompletionInformation == null)
                return null;

            return Task.CompletionInformation.Notes;
        }

        set
        {
            if (this.Task == null)
                return;

            this.Task.CompletionInformation.Notes = value;
        }
    }

    public virtual DateTime? CompletionDate
    {
        get
        {
            if (this.Task == null || this.Task.CompletionInformation == null)
                return null;

            return Task.CompletionInformation.Date;
        }

        set
        {
            if (this.Task == null)
                return;

            this.Task.CompletionInformation.Date = value;
        }
    }

    public virtual IUser User
    {
        get
        {
            if (this.Task == null || this.Task.CompletionInformation == null)
                return null;

            return Task.CompletionInformation.User;
        }

        set
        {
            if (this.Task == null || value == null)
                return;

            if (this.Task.CompletionInformation != null)
                this.Task.CompletionInformation.User = value;
        }
       }
    }
 }

Это будет направление карты, которое я начал для него:

public class JobTaskMap : ClassMap<JobTask>
{
    private const string ModelTable = "[JobTasks]";

    public JobTaskMap()
    {
        Table(ModelTable);

        Id(jobTask => jobTask.Id)
            .Column("Id")
            .GeneratedBy.Identity();

        References<Job>( jobTask => jobTask.ParentJob)
            .Column("JobId")
            .Fetch.Join();

        Component<Task>( jobTask => (Task) jobTask.Task,
                // This is the task
                 comp =>
                 { 
                     // This is the task completion information
                     comp.Component<TaskCompletionDetails>(
                         task => (TaskCompletionDetails)task.CompletionInformation,
                         compInfo =>
                         {    
                             compInfo.Map(info => info.Date)
                                .Column("CompletionDate")
                                .Nullable();

                             compInfo.Map(info => info.Notes)
                                .Column("CompletionNotes")
                                .Nullable();

                             compInfo.References<User>(info => info.User)
                                .Column("CompletedByUserId")
                                .Nullable()
                                .Fetch.Join();
                         });  
                 });

    }

Вот некоторые другие связанные чтения, за которыми я следовал без успеха:

Ссылка:

http://wiki.fluentnhibernate.org/Fluent_mapping

Свободное отображение Nhibernate «многие ко многим» сдополнительный столбец

1 Ответ

0 голосов
/ 10 ноября 2011

Вот путь, который зависит от используемой стратегии генерации идентификатора. если используется Identity, это не сработает (по крайней мере, NH не рекомендует использовать Identity по разным причинам), но с каждой стратегией, которая вставляет сам идентификатор, это будет работать:

class JobMap : ClassMap<Job>
{
    public JobMap()
    {
        Id(x => x.Id);

        HasMany(x => x.Tasks)
            .KeyColumn("JobId");
    }
}

class TaskMap : ClassMap<Task>
{
    public TaskMap()
    {
        Table("JobTask");
        Id(x => x.Id, "TaskId");

        Component(x => x.CompletionInfo, c =>
        {
            c.Map(x => x.CompletionDate);
            c.References(x => x.User, "CompletedByUserId");
        });

        Join("Task", join =>
        {
            join.Map(x => x.Name, "Name");
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...