【发布时间】:2013-07-31 17:00:49
【问题描述】:
我有一个遗留数据库,它使用 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 语义,将 Parent 的 IDictionary 替换为 IList。这是使用类似的东西映射的:
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,但如果更新的版本会有所帮助,我很灵活。
【问题讨论】:
标签: nhibernate fluent-nhibernate