簡體   English   中英

Fluent Nhibernate 聚合對象映射

[英]Fluent Nhibernate Aggregate objects mapping

假設我有以下 class 與外部 class 的聚合:

public class MyMovie
{
    public virtual string id{get;set;}
    public virtual Movie movie{get;set;}
}

//These classes are externally defined and cannot be changed.
public class Movie
{
    public string title{get;set;}
    public IList<Director> Directors{get;set;}
}

public class Director
{
    public string name{get;set;}
    public IList<Movie> DirectedMovies{get;set;}
}

用於此的 db 架構將是三個表:

電影(m_id,標題)

導演(d_id,姓名)

指導(m_id,d_id)

是否可以通過流暢的 nhibernate 實現 map? 我只是不明白如何在外部類中的多對多關系中完成此操作,在該類中我無法為 Director 創建 map class,因為這並未將成員定義為虛擬。

基本上,您的問題是您試圖告訴 nhibernate 加載對象,但它對對象一無所知。 例如,您告訴它 MyMovie 包含一個 Movie,但它不知道 Movie.title 屬於哪個字段,並且它不知道如何將 Director's 加入到電影中,因為它沒有映射。 所以基本上為了在沒有映射文件的情況下實現這一點,您需要使用標准和結果轉換器來完成此操作(基本上發出 sql 查詢並通過動態映射將結果轉換為對象),您可以將此邏輯封裝在一個 function 所以它可以在你的代碼中調用而不會太亂,但除此之外我看不到任何其他方式。 看看這篇文章,代碼並不完全是你想要做的(因為你必須加入導演),但它使用的是你必須使用的相同工具...... http://ayende.com/博客/2741/partial-object-queries-with-nhibernate

Map 你的 class MyMovie像往常一樣,並使用禁用MovieDirector的延遲加載。 畢竟多對多部分的延遲加載應該像往常一樣工作,不需要收集延遲代理的原因。

public class MyMovieMap : ClassMap<MyMovie>
{
    public MyMovieMap()
    {
        Id(x => x.id);
        References(x => x.movie);
    }
}

public class MovieMap : ClassMap<Movie>
{
    public MovieMap()
    {
        Not.LazyLoad();
        Id<int>("m_id");
        Map(x => x.title);
        HasManyToMany(x => x.Directors)
            .Table("Directs")
            .LazyLoad();
    }
}

public class DirectorMap : ClassMap<Director>
{
    public DirectorMap()
    {
        Not.LazyLoad();
        Id<int>("d_id");
        Map(x => x.name);
        HasManyToMany(x => x.DirectedMovies)
            .Table("Directs")
            .LazyLoad();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM