добавить объекты с дочерними коллекциями - PullRequest
0 голосов
/ 08 марта 2011

У меня есть два класса: класс Site и класс Phase. Класс Site определяет коллекцию Phases. Каждый класс соответствует таблице базы данных. База данных (SQL Server 2000) имеет ссылку «один ко многим» между двумя таблицами, так что данный сайт может быть связан со многими фазами, а данная фаза может быть связана только с одним сайтом.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public class Site
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    public virtual ICollection<Phase> Phases {get; set;}
}

public class Phase
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    [Editable(true)]
    [StringLength(16)]
    public virtual string Code { get; set; }

    public virtual int SiteId {get; set;}
    public virtual Site Site {get; set;}
}

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

Site site = new Site() { Name = "SiteName" };
Phase phase = new Phase() { Name = "PhaseName", Code = "Code" };
Phase otherPhase = new Phase() { Name = "OtherPhaseName" };

site.Phases.Add(phase);
site.Phases.Add(otherPhase);

Session.SaveOrUpdate(site);

У меня есть следующие сопоставления, но они не справляются:

public class SiteMap : ClassMap<Site>
{
    public SiteMap()
    {
        Id(p => p.Id).Column("ST_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("ST_Name");

        HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").LazyLoad().Inverse().AsSet();
    }
}

public class PhaseMap : ClassMap<Phase>
{
    public PhaseMap()
    {
        Id(p => p.Id).Column("PH_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("PH_Name");
        Map(p => p.Code).Column("PH_Code").Nullable();
        Map(p => p.SiteId).Column("ST_ID");

        References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
    }
}

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

1 Ответ

1 голос
/ 08 марта 2011
References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();

Должно быть просто

References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy);

Ваши спецификации Not Insert и Update не обновляют этот столбец при вставке или обновлении таблицы.

Вам также нужно указать Каскад в конце одного-многих

HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").Cascade.AllDeleteOrphan().LazyLoad().Inverse().AsSet();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...