Tom*_*ell 6 nhibernate nhibernate-mapping fluent-nhibernate automapping
似乎NHibernate不能自动化实体中给定类型的多个IList.
考虑以下两个实体(基于Fluent NHibernate源代码中包含的Examples.FirstProject示例代码).
public class Employee
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class Store
{
public virtual int Id { get; private set; }
public virtual IList<Employee> Staff { get; set; }
public virtual IList<Employee> Managers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个完全有效的对象模型 - 每个商店都有几名员工和几名经理员工.
但是当我自动化时,Staff和Managers列表存储在Employee表中,所有这些列表都具有相同的外键.
Employee Table
Id FirstName LastName Store_id
3 Daisy Harrison 1
4 Jack Torrance 1
5 Sue Walkters 1
6 Tom Tommorow 1
7 Dick Diggler 1
Run Code Online (Sandbox Code Playgroud)
最终结果是,当数据从数据库中读回时,工作人员和经理列表都填充了表中的每一行.
这看起来像Automapping中的一个错误,但我对NHibernate的任何形式都相当新,并且还不完全了解它的局限性.
在任何情况下,我如何让NHibernate将这两个列表视为不同?
如果可能的话,我会欣赏一个Automapping代码片段,它直接解决了我提供的示例代码(例如"将此精确覆盖放在CreateSessionFactory的.Mappings部分中").
这是因为我对Automapping有点熟悉,并且根本不熟悉旧的做事方式,这意味着我不能很好地"填补空白".
但如果你只有时间指出我正确的方向,那也会有所帮助.
这是我的CreateSessionFactory代码,给出一些上下文:
private static ISessionFactory CreateSessionFactory()
{
ISessionFactory sessionFactory = null;
const string autoMapExportDir = "AutoMapExport";
if( !Directory.Exists(autoMapExportDir) )
Directory.CreateDirectory(autoMapExportDir);
try
{
var autoPersistenceModel =
AutoMap.AssemblyOf<Product>()
.Where(t => t.Namespace == "Examples.FirstProject.Entities")
.Conventions.Add( DefaultCascade.All() )
;
sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add(autoPersistenceModel)
.ExportTo(autoMapExportDir)
)
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory()
;
}
catch (Exception e)
{
Console.WriteLine(e);
}
return sessionFactory;
}
Run Code Online (Sandbox Code Playgroud)
保罗·巴图姆回答我的问题在这里,并提供了一个独立的工作示例这里(点击下载按钮,您导航到链接的页面后).
从他的答案中复制以下代码.关键点在列表末尾的StoreMap类中,它使用Where子句设置覆盖,该子句使用Employee中的IsManager属性.
请注意(至少在1.0.0.594版本中)有一个与自动映射有关的大问题 - 映射类(例如StoreMap)不能与域类在同一个命名空间中(例如Store)!
否则,NHibernate将抛出"NHibernate.MappingException:(XmlDocument)(2,4):XML验证错误:......",绝对没有迹象表明真正的问题是什么或在哪里.
这可能是一个可能在Fluent NHibernate的更高版本中修复的错误.
public class Employee
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual bool IsManager { get; set; }
}
public class Store
{
public virtual int Id { get; private set; }
public virtual IList<Employee> Staff { get; private set; }
public virtual IList<Employee> Managers { get; private set; }
public Store()
{
Staff = new List<Employee>();
Managers = new List<Employee>();
}
public void AddManager(Employee employee)
{
employee.IsManager = true;
this.Managers.Add(employee);
}
public void AddStaff(Employee employee)
{
this.Staff.Add(employee);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是商店的映射覆盖:
// Must be in different Namespace from class Store!!!
public class StoreMap : IAutoMappingOverride<Store>
{
public void Override(AutoMapping<Store> mapping)
{
mapping.HasMany(x => x.Managers)
.Cascade.All()
.Where("(IsManager = 1)");
mapping.HasMany(x => x.Staff)
.Cascade.All()
.Where("(IsManager = 0)");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |