我正在使用FluentNhibernate。我正在努力使我的Map文件尽可能轻量化,依赖于Convention文件来处理表名,外键列等。
我的HasManyToManyConvention有点问题。
我有2个对象。 Models.Processor
和Models.Worker
。
处理器可以与许多工作人员相关联,反之亦然。
public class Processor : Entity
{
...
public virtual IList<Worker> Workers { get; set; }
public virtual void AddWorker(Worker worker)
{
worker.AddProcessor(this);
Workers.Add(worker);
}
}
public class Worker : Entity
{
...
public virtual IList<Processor> Processors { get; set; }
public virtual void AddProcessor(Processor processor)
{
processor.AddWorker(this);
Processors.Add(processor);
}
}
我还有2张地图将2个实体相互映射。
public ProcessorMap()
{
HasManyToMany<Processor>(x => x.Workers)
.Table("WorkerProcessor")
.ParentKeyColumn("ProcessorId")
.ChildKeyColumn("WorkerId");
}
此时一切正常。
与Parent&amp ;;的WorkerMap的互惠设置儿童钥匙反转。我想以这样的方式设置它,我不需要指定表格和放大器。地图中的parentkey / childkey属性,所以我在项目中添加了一些约定,并将它们包含在流畅的配置中。
public class ForeignKeyConvention : FluentNHibernate.Conventions.ForeignKeyConvention
{
protected override string GetKeyName(Member property, Type type)
{
if (property == null)
return type.Name + "Id";
return property.Name + "Id";
}
}
public class HasManyToManyConvention : IHasManyToManyConvention
{
public void Apply(IManyToManyCollectionInstance instance)
{
instance.Cascade.SaveUpdate();
}
}
public class ManyToManyTableNameConvention :
FluentNHibernate.Conventions.ManyToManyTableNameConvention
{
protected override string GetBiDirectionalTableName(
IManyToManyCollectionInspector collection,
IManyToManyCollectionInspector otherSide)
{
return collection.EntityType.Name + otherSide.EntityType.Name;
}
protected override string GetUniDirectionalTableName(
IManyToManyCollectionInspector collection)
{
return collection.EntityType.Name + collection.ChildType.Name);
}
}
所以当我调试它时会发生什么,它是步入GetBiDirectionalTableName
方法的,由于某些原因,collection
和otherside
属性都属于{{1}类型}。我希望1为Processor
,而1为Processor
。结果是FN引发了以下异常。
Worker
任何帮助/指示都将不胜感激。
答案 0 :(得分:0)
原来我在HasManyToMany()
映射上遗漏了一些额外的参数。
您需要指定其中一个是Inverse()