我正在尝试从另一个项目实现一个接口,并使用流畅的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适用于单个界面实例,当我有完整的界面列表时,如何使用这样的东西?
谢谢!
答案 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> A
,IList<B> B
..引入Tag
本身。但我们仍然可以通过一些查询