【问题标题】:add objects with child collections添加带有子集合的对象
【发布时间】:2011-03-08 17:50:10
【问题描述】:

我有两个类: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 进行映射。我想把它映射成这样,这样我就可以创建一个新的 Site 实例,分配几个 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 的新手,所以我知道这里显示的映射可能存在其他我不知道的问题。任何有关如何最好地映射这两个类的帮助将不胜感激。 TIA。

【问题讨论】:

标签: nhibernate fluent-nhibernate one-to-many mapping-model


【解决方案1】:
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 规范不会更新此列。

您还需要在一对多端指定 Cascade

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

【讨论】:

  • 如果数据库已经定义了级联删除关系,是否需要 Cascase.AllDeleteOrphan?
  • @Ralf,如果您的数据库已配置,您只需指定Cascade.SaveUpdate 这样您的实体将在保存或插入父对象时保存和插入。
  • 谢谢。我会玩这个,看看它会把我带到哪里。感谢您的意见。
猜你喜欢
  • 2012-04-27
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多