【问题标题】:Fluent NHibernate mapping properties coming from an interface in one placeFluent NHibernate 映射属性来自一个地方的接口
【发布时间】:2011-02-28 13:39:31
【问题描述】:

如果许多类实现相同的接口,是否可以将这些接口属性映射到一个位置?还有更多代码@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();
    }
}

【问题讨论】:

    标签: c# interface fluent-nhibernate


    【解决方案1】:

    如果 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:
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2011-08-31
      相关资源
      最近更新 更多