流利的Nhibernate接口列表

时间:2014-01-06 21:40:56

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我正在尝试从另一个项目实现一个接口,并使用流畅的nhibernate将其持久化到数据库。我已经想出如何持久保存接口的单个​​实例,但无法弄清楚如何完成整个列表。

我的课程定义如下:

public interface IRunnable     {         int Velocity {get;组; }         int GetSpeed();     }

public class Person : IRunnable
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    //public virtual IList<Car> Cars { get; set; }

    public Person()
    {
        //this.Cars = new List<Car>();
    }

    public virtual int GetSpeed()
    {
        return -1;
    }

    public virtual int Velocity { get; set; }
}

public class Person1 : IRunnable
{
    public virtual int Id { get; set; }
    public virtual int Age { get; set; }
    public virtual int Velocity { get; set; }

    public virtual int GetSpeed()
    {
        return 0;
    }
}

public class Car
{
    public virtual int Id { get; set; }
    public virtual IRunnable Runnable { get; set; }

    public virtual IList<IRunnable> Runnables { get; set; }

    public Car()
    {
        Runnables = new List<IRunnable>();
    }
}

映射定义

 public class Person1Map : ClassMap<Person1>
{
    public Person1Map()
    {
        Id(x => x.Id);
        Map(x => x.Age);
        Map(x => x.Velocity);
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Velocity);
        //HasMany(x => x.Cars).Cascade.All();
    }
}

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.Id);

        ReferencesAny<IRunnable>(x => x.Runnable)
            .IdentityType<int>()
            .EntityTypeColumn("RunnableType")
            .EntityIdentifierColumn("RunnableId")
            .AddMetaValue<Person>("P")
            .AddMetaValue<Person1>("P1")
            .Cascade.All();

        HasMany(x => x.Runnables)
            .KeyColumn("RunnableId")
            .Cascade
            .All();

    }
}

引用Any适用于单个界面实例,当我有完整的界面列表时,如何使用这样的东西?

谢谢!

2 个答案:

答案 0 :(得分:0)

使用接口的HasMany并不那么容易,或者说它有一些限制。

这取决于你的映射策略你的继承是如何工作的。查看文档here

你可以找到一个好的帖子on SO about it here...

基本上,您可能必须为接口添加类映射并为您的实现创建子类映射。这将是每个具体类映射的表,它应该可以正常工作。

答案 1 :(得分:0)

流畅的NHibernate的答案就在这里:https://github.com/jagregory/fluent-nhibernate/issues/56,摘录:

  

多对任何支持

     

我们仍然不支持多对多

如何详细观察多人对任何人的工作情况:Ayende, NHibernate mapping, many-to-any

但最重要的信息可以在这里找到:6.10. Heterogeneous Associations

  

<many-to-any> <index-many-to-any>元素提供了真正的异构关联。这些映射元素的工作方式与元素相同 - ,也应该很少使用,如果有的话

注意:请尝试重新考虑您的模型。我的经验是,从任何短视角的简化都会获胜。换句话说,如果我们有一个类似Tag的类,几乎可以在任何地方引用...通常我们不会将IList<A> AIList<B> B ..引入Tag本身。但我们仍然可以通过一些查询

找到与A ...相关的标签