10

Próbuję nauczyć NHibernate 3.2 built-in mapping by code api (NIE FluentNhibernate, ani XML). Czy możesz mi pomóc odwzorować relację wiele do wielu między tymi jednostkami?3.2 NHibernate wiele do wielu mapowania za pomocą kodu

public class Post { 
    public virtual Id { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

public class Tag { 
    public virtual Id { get; set; } 
    public IList<Post> Posts { get; set; } 
} 

Moja pierwotna strategia jest kluczem:

Id( 
    t => t.Id, 
    t => { 
     t.Generator(Generators.HighLow, g => g.Params(new { max_low = 100 })); 
     t.Column(typeof(TEntity).Name + "Id"); 
    }); 

i próbuję to:

// TagMap : ClassMapping<Tag> 
Bag(t => t.Posts, bag => { 
    bag.Inverse(true); 
    bag.Table("TagsPosts"); 
    bag.Cascade(Cascade.DeleteOrphans); 
}, t => t.ManyToMany(c => { 
    c.Column("PostId"); 
    c.Lazy(LazyRelation.Proxy); 
})); 

// PostMap : ClassMapping<Post> 
Bag(t => t.Tags, bag => { 
    bag.Table("TagsPosts"); 
    bag.Cascade(Cascade.DeleteOrphans); 
}, t => t.ManyToMany(c => { 
    c.Column("TagId"); 
    c.Lazy(LazyRelation.Proxy); 
})); 

ale to nie działa.

Odpowiedz

27
// Post Map 
Bag(x => x.Tags, collectionMapping => 
       { 
        collectionMapping.Table("TagPosts"); 
        collectionMapping.Cascade(Cascade.None); 
        collectionMapping.Key(k => k.Column("PostID")); 
       }, 
        map => map.ManyToMany(p => p.Column("TagID"))); 

// Tag Map 
Bag(x => x.Posts, collectionMapping => 
             { 
              collectionMapping.Table("TagPosts"); 
              collectionMapping.Cascade(Cascade.None); 
              collectionMapping.Key(k => k.Column("TagID")); 
             }, 
       map => map.ManyToMany(p => p.Column("PostID"))); 
+1

Dzięki. To działa! Odpowiedź Wygłoszono i zaakceptowano: D –

+0

Czy możesz dodać wyjaśnienie, że nie używasz kaskadowania? – Daniel

1

myślę, że trzeba ustawić klucz powiedzieć NHibernate, która kolumna na wiele-do-wielu tabeli to musi sprawdzić, coś takiego:

// TagMap 
bag.Key(k => k.Column("TagId")); 

// PostMap 
bag.Key(k => k.Column("PostId"));