我正在尝试使用Fluent的Automapping功能。
该类有一个包含在包含List的特殊类中的对象列表。它基本上是为了通过各种线程来处理List的自动锁定。
基本上这是一个类似的模型:
public class Garage
{
private MutexList<Vehicles> vehicles = new MutexList<Vehicles>();
public virtual MutexList<Vehicles> Vehicles
{
get { return vehicles; }
set { vehicles = value; }
}
}
public class MutexList<T>
{
private List<T> list = new List<T>();
private readonly int timeout = 1000;
public List<T> List
{
get { return list; }
set { list = value; }
}
}
这是我的自动映射调用:
try
{
var cfg = new StoreConfiguration();
var _factory = Fluently.Configure()
.Database(
MsSqlConfiguration
.MsSql2008
.ConnectionString("Server=192.168.0.115;Initial Catalog=EMTRAC3;User ID=EMCollector;Password=9o0(O);")
.ShowSql()
)
.Mappings(m =>
m.AutoMappings.Add(
AutoMap.AssemblyOf<Product>(cfg)
).ExportTo(@"C:\Temp\Fluent")
)
.BuildConfiguration()
.BuildSessionFactory();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
最后这里是ShouldMap函数,我不完全确定为什么我要调用它但没有它我没有映射任何东西:
public class StoreConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return
type.Name == "Garage"
|| type.Namespace.Contains("Mutex");
}
}
有人可以告诉我,我必须做的是能够将车库类别与车辆清单中包含的所有车辆一起映射吗?我正在尝试使用AutoMapping为此生成NHibernate的XML模式,但我没有任何运气,想知道如何以这种方式完成类中包含的列表的映射。
答案 0 :(得分:2)
您无法直接映射自定义集合类。
在Chapter 6. Collection Mapping中非常明确:
NHibernate要求将持久的集合值字段声明为接口类型[...]实际接口可能是
Iesi.Collections.ISet
,System.Collections.ICollection
,System.Collections.IList
,System.Collections.IDictionary
,System.Collections.Generic.ICollection<T>
,System.Collections.Generic.IList<T>
,System.Collections.Generic.IDictionary<K, V>
,Iesi.Collections.Generic.ISet<T>
或......您喜欢的任何内容! (“你喜欢的任何东西”意味着你必须编写NHibernate.UserType.IUserCollectionType
的实现。)
答案 1 :(得分:1)
虽然我没有尝试过,但我相信以下代码应该可以毫不费力地进行Automap。 (但是,不确定私人“超时”成员)
此外,我在两个类中都添加了 Id 属性,因此您应该可以取消“ShouldMap”覆盖。
public class Garage
{
public virtual int Id { get; private set; }
public virtual MutexList<Vehicles> Vehicles { get; set; }
public Garage()
{
Vehicles = new MutexList<Vehicles>();
}
}
public class MutexList<T>
{
public virtual int Id { get; private set; }
// Not sure if this will be persisted
private readonly int timeout = 1000;
public virtual IList<T> List { get; set; }
public MutexList<T>()
{
List = new List<T>();
}
}