Свободные свойства отображения NHibernate, поступающие из интерфейса в одном месте - PullRequest
2 голосов
/ 28 февраля 2011

Если многие классы реализуют один и тот же интерфейс (ы), возможно ли отобразить эти свойства интерфейса в одном месте? Там больше код @ pastebin

Здесь вы можете видеть, что классы имеют некоторые общие интерфейсы (но не все для создания общего базового класса), и мне пришлось повторить сопоставления.

public class PostMapping : SubclassMap<Post>
{
    public PostMapping()
    {
        Map(x => x.Text, "Text");
        // coming from IMultiCategorizedPage
        HasManyToMany(x => x.Categories).Table("PageCategories").ParentKeyColumn("PageId").ChildKeyColumn("CategoryId").Cascade.SaveUpdate();
        // coming from IMultiTaggedPage
        HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate();
        // coming from ISearchablePage
        Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad();
    }
}
public class ArticleMapping : SubclassMap<Article>
{
    public ArticleMapping()
    {
        Map(x => x.Text, "Text");
        // coming from ISingleCategorizedPage
        References(x => x.Category, "CategoryId");
        // coming from IMultiTaggedPage
        HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate();
        // coming from ISearchablePage
        Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad();
    }
}

1 Ответ

1 голос
/ 28 февраля 2011

Если бы C # имел полное множественное наследование вместо просто множественного наследования интерфейса, то это было бы легко.Кажется, самым близким было бы создание единого интерфейса-обертки для базового класса отображения, в котором будут храниться ваши общие элементы.Затем вы можете создать классы отображения, специфичные для таблицы, которые наследуются от нее.Что-то вроде этого кода:

public class BasePageMapping : SubclassMap<IPage> //IPage could inherit: IMultiTaggedPage, ISearchablePage
{
    public BasePageMapping()
    {
        Map(x => x.Text, "Text");
        // coming from IMultiTaggedPage
        HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate();
        // coming from ISearchablePage
        Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad();
    }
}

public class PostMapping : BasePageMapping
{
    public PostMapping()  // don't need to specify : base() because it happens automatically
    {
        Table("the specific table");

        HasManyToMany(x => x.Categories).Table("PageCategories").ParentKeyColumn("PageId").ChildKeyColumn("CategoryId").Cascade.SaveUpdate();

        //Other table specific mappings:
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...