c# - Fluent NHibernate 映射属性来自一个地方的接口(interface)

标签 c# interface fluent-nhibernate

如果许多类实现相同的接口(interface),是否可以将这些接口(interface)属性映射到一个地方?还有更多代码@ pastebin

你可以在这里看到类有一些公共(public)接口(interface)(但不是所有接口(interface)都是公共(public)基类),我不得不重复映射。

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)继承,那么这将很容易。看起来最接近的是为映射基类创建一个包装接口(interface)来保存您的公共(public)元素。然后,您可以创建从它继承的特定于表的映射类。这段代码的内容:

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

关于c# - Fluent NHibernate 映射属性来自一个地方的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5142687/

相关文章:

java - java抽象类和接口(interface)最佳实践

java - 阴影还是实现?

c# - Nhibernate GetById 返回 ObjectNotFoundException insetad of null

entity-framework - Entity Framework 分离对象合并

c# - 扩展 C# 语言?

c# - TFVC checkin 最佳实践

javascript - 使用 jquery 将数据发送到 MVC Controller

C#拳击题

java - 设计决策 : Why and when to make an interface private?

nhibernate - DB2 Fluent NHibernate 在 HasMany 映射中映射重复记录