我有一个遗留数据库,它使用guid将子映射到父实体。
在我的域图层中,我更喜欢模糊这个怪癖,所以我想让我的父实体看起来像这样:
public class Parent
{
virtual public int Id {get; protected set; }
virtual public string ParentContent { get; set; }
virtual public Guid ReferenceId { get; set; }
virtual public IDictionary<int,Child> Children { get; set; }
}
public class Child
{
virtual public int Id { get; protected set; }
virtual public Parent { get; set; }
virtual public string ChildContent { get; set; }
}
然后,父级会将每个Child.Id映射到Children字典中的Child。子映射工作正常,但我似乎无法为父级找到合理的映射。
父表和子表中都存在名为ParentReferenceID的字段,因此我尝试使用以下内容映射:
mapping.HasMany<Broker>(x => x.Children)
.Table("Child")
.KeyColumn("ParentReferenceID")
.Inverse()
.AsMap<long>(index=>index.Id,val=>val.Type<Broker>());
不幸的是,这会产生错误: 类型或方法有2个通用参数,但提供了1个通用参数。必须为每个通用参数提供通用参数。
为了简化我的问题,我开始尝试使用Bag语义,用IList替换Parent的IDictionary。这是使用类似的东西映射的:
mapping.HasMany<Broker>(x => x.Brokers)
.Table("Child")
.KeyColumn("ParentReferenceId")
.Inverse()
.AsBag();
这会产生更明显的异常, System.Data.SqlClient.SqlException:操作数类型碰撞:uniqueidentifier与int不兼容
不幸的是,我似乎无法找出告诉它加入ReferenceID字段的正确方法。这样做的正确方法是什么?我更喜欢这本字典,但如果我能让这个包上班,我会非常高兴。
为了清楚起见,我使用了一个Fluent的版本,它与最近从git中提取的SharpArchitecture捆绑在一起。 Fluent dll标记为版本1.0.0.594,但如果更新的版本有帮助,我就很灵活。
答案 0 :(得分:0)
进一步的挖掘让我找到了Bag案例的解决方案,虽然字典仍然给我带来了一些麻烦。
该解决方案需要Fluent NHibernate的OneToManyPart映射类的补丁。 (帽子提示到This bug report: Could not map a one-to-many relationship where the key is not the primary key。
mapping.HasMany(x => x.Children)
.Table("Child").KeyColumn("ParentReferenceId")
.PropertyRef("ReferenceId")
.Inverse()
.AsBag();
理论上,AsMap应该以同样的方式工作,但由于某种原因,我并不完全清楚,它对我不起作用。我稍后会探讨,但我愿意接受建议。