如何在流畅的nhibernate中使用复合ID在一对多映射中?

时间:2013-02-26 07:40:46

标签: fluent-nhibernate one-to-many composite-id

我得到了一个复合ID唯一标识实体的场景。我将MSSQL定义为在这些字段上有一个多主键。另外,我希望使用自动递增的id来引用一对多关系。这是架构:

public class Character
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Region Region { get; set; }
    public virtual string Realm { get; set; }
    public virtual IList<CharProgression> Progression { get; set; }
}

public class CharProgression
{
    public virtual int Id { get; set; }
    public virtual Character Character { get; set; }
    public virtual Stage Stage { get; set; }
    public virtual int ProgressionPoints { get; set; }
    public virtual int NumOfSaves { get; set; }
}

public class Stage
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

映射看起来像这样:

class CharacterMap : ClassMap<Character>
{
    public CharacterMap()
    {
        Table("characters");
        Id(ch => ch.Id, "id").GeneratedBy.Identity().Not.Nullable();
        CompositeId().KeyProperty(ch => ch.Region, "region")
            .KeyProperty(ch => ch.Realm, "realm")
            .KeyProperty(ch => ch.Name, "name");
        HasMany<CharProgression>(ch => ch.Progression).Inverse().Cascade.All();
    }
}

class CharProgressionMap : ClassMap<CharProgression>
{
    public CharProgressionMap()
    {
        Table("char_progression");
        CompositeId().KeyReference(cprog => cprog.Character, "char_id",
                     .KeyReference(cprog => cprog.Stage, "stage_id");
        Id(cprog => cprog.Id, "id").GeneratedBy.Identity().Not.Nullable();
        Map(cprog => cprog.ProgressionPoints, "progression_points");
        Map(cprog => cprog.NumOfSaves, "num_of_saves");
    }
}


public class StageMap : ClassMap<Stage>
{
    public StageMap()
    {
        Table("stages");
        Id(st => st.Id, "id").GeneratedBy.Identity().Not.Nullable();
        Map(st => st.Name, "name");
        Map(st => st.Description, "description");
    }
}

现在,问题是我想在一个字符上使用SaveOrUpdate()并使用复合id进行更新,因为字符唯一性由这三个字段定义 - region,realm,name。 但是,当我从CharProgression引用Character时,我不想使用复合Id,因为我不希望char_progression表保存3个字段来识别字符,简单的Id就够了......这就是为什么我还在Character实体上定义了IDENTITY id。

我正在尝试的是什么?还是有另一种方法来实现这个目标吗?

谢谢:)

0 个答案:

没有答案
相关问题