0

TimeSheetActivityクラスには、割り当てのコレクションがあります。ドメインにこの関係を使用するための最も便利な方法はIDictionaryを、すなわちであるこのモデルをマップする方法

public class Allocation : ValueObject { 
    public virtual StaffMember StaffMember { get; private set; } 
    public virtual TimeSheetActivity Activity { get; private set; } 
    public virtual DateTime EventDate { get ... } 
    public virtual TimeQuantity TimeSpent { get ... } 
} 

public virtual IEnumerable<Allocation> Allocations { 
get { return _allocations.Values; } } 

private readonly IDictionary<DateTime, Allocation> _allocations = new SortedList<DateTime, Allocation>(); 

私もする必要が配分は、値オブジェクト(不変)このような何かを探していますStaffMemberによって割り当てを永続化および取得できます。

table Allocations 
    ActivityID 
    StaffMemberID 
    EventDate 
    TimeQuantity 

私はマッピングを可視化するトラブルを抱えている:これは、設計データ駆動型だった場合、私のコンセプトは、活動とStaffMembers間の多対多の関係を解決するでしょうアロケーションテーブルがあるだろうということです。私はTimeSheetActivityの割り当てを開始しようとしていますが、DDLを生成しようとすると以下のエラーが表示されます。

NHibernate.MappingException:(XmlDocument)(3,6):XML検証エラー:名前空間 'urn:nhibernate-mapping-2.2'の無効な子要素 'property'がネームスペース 'urn:nhibernate-mapping-2.2'にあります。予想される要素のリスト:名前空間 'urn:nhibernate-mapping-2.2'の 'meta、subselect、cache、synchronize、comment、tuplizer、id、composite-id'

私はエラーを取得していた場合、私は言うことができない理由は次のとおりです(FNH)で

A). I haven't yet mapped StaffMember to a collection of Allocations. 
B). The mapping I have between Activity and Allocations is wrong. 
C). All of the above 
D). Other _____________________________________ 

AllocationMapping

public class AllocationMap : IAutoMappingOverride<Allocation> 
{ 
    public void Override(AutoMap<Allocation> mapping) 
    { 

     // these are both derived from the time period, so ignore 
     mapping.IgnoreProperty(x => x.TimeSpent); 
     mapping.IgnoreProperty(x => x.EventDate); 

     // TimePeriodUserType knows how to persist the time period start and end dates as DateTimes 
     mapping.Map(x => x.TimeSpentPeriod) 
      .ColumnNames.Add("PeriodStart", "PeriodEnd") 
      .SetAttribute("type", typeof(TimePeriodUserType).AssemblyQualifiedName); 

     mapping.References(x => x.Activity).WithForeignKey().FetchType.Join().Not.Nullable(); 
     mapping.References(x => x.StaffMember).WithForeignKey().FetchType.Join().Not.Nullable(); 
    } 
} 

割り当てマッピング(生成HBM)

.... 
<property name="TimeSpentPeriod" type="..., ..., ..."> 
    <column name="PeriodStart" /> 
    <column name="PeriodEnd" /> 
</property> 
<many-to-one foreign-key="FK_AllocationToStaffMember" fetch="join" not-null="true" name="StaffMember" column="StaffMemberID" /> 
<many-to-one foreign-key="FK_AllocationToActivity" fetch="join" not-null="true" name="Activity" column="TimeSheetActivityID" /> 
.... 

アクティビティマッピング(FNH)

public class TimeSheetActivityMap : IAutoMappingOverride<TimeSheetActivity> 
{ 
    public void Override(AutoMap<TimeSheetActivity> mapping) 
    { 
     // this can be replaced by some id given by NHib via an inheritance type mapping?? 
     mapping.IgnoreProperty(x => x.IdScheme); 

     // this is derived 
     mapping.IgnoreProperty(x => x.TotalTime); 

     // this is for client consumption only 
     mapping.IgnoreProperty(x => x.Allocations); 

     mapping.HasMany(x => x.Allocations) 
      .AsMap(x => x.EventDate) 
      .Cascade.All() 
      .Access.AsCamelCaseField(Prefix.Underscore) 
      .WithForeignKeyConstraintName("FK_ActivityAllocation"); 
    } 
} 

ActivityMapping(生成HBM)

<set name="Allocations" cascade="all" access="field.camelcase-underscore"> 
<key foreign-key="FK_ActivityAllocation" column="TimeSheetActivityID" /> 
<one-to-many class="Smack.ConstructionAdmin.Domain.Model.TimeSheet.Allocation, ..." /> 
</set> 

これは、NHibernateの経験の私のレベルのための複雑なマッピングであるので、私は、モデリングの概念をマッピング技術上の任意のヘルプ、質問、批判をいただければと思い、またはこれを通じた私のアプローチ。

乾杯、 Berryl

答えて

2

私はFHNの専門家ではないが、私はあなたの割り当てプロパティが設定として生成されていることを参照してください。あなたはこのように地図要素を取得する必要があります:

<map name="Allocations" lazy="true" table="Allocations"> 
<key column="FK_ActivityAllocation"/> 
<index column="EVENT_DATE" type="DateTime"/> 
<composite-element class="Allocation"> 
... 
</composite> 
</map> 

あなたがここにいくつかの高度な例だ: http://ayende.com/Blog/archive/2009/06/03/nhibernate-mapping-ndash-ltmapgt.aspx

+0

それは確かはず、と私は私のモデルを変更したことになりましたし。私はAllocation an Entityを作成しました。これは、私のフレームワークでは、連想テーブルの代理キーとして便利に機能するIdで終わることを意味します。 Allocationが実際に私のドメインモデル内の実体であるかどうかについての疑問が浮かび上がってくるのですか、あるいはそれを機能させるために値型のコレクションをダミーにしています(もしあれば、代理を得るためのよりきれいな方法があります)キー、または複合キーまたは..を使用する必要があります)。とにかく、私は読む必要があるAyendeの投稿のためのヒントと感謝のおかげで!乾杯 – Berryl

関連する問題