【发布时间】:2014-12-20 06:35:47
【问题描述】:
我有一个具有以下结构的数据表:
MyTable
-------------------------------------
rule_name char(20) PK
value_type char(20) PK
value varchar(50) not null
dt_last_update datetime not null
在此表中表示的数据中,我有一个感兴趣的rule_name:
MailboxSC
我有两个不同的属性或称之为value_type:
numberOfEmails
dateTimeReceived
我无法控制也没有任何权力。
使用DynamicObject,我已经从 Ayende Rahien 那里得到了我所能做的:
Support dynamic fields with NHibernate and .NET 4.0
那么现在,我的模型。
电子邮件指示符
public class EmailIndicator {
public EmailIndicator(HashtableDynamicObject hastableDynamicObject) {
this.hashtableDynamicObject = hashtableDynamicObject;
}
public virtual dynamic Attributes { get { return hashtableDynamicObject; } }
private readonly HashtableDynamicObject hashtableDynamicObject;
}
HashtableDynamicObject
public class HashtableDynamicObject : DynamicObject {
public HashtableDynamicObject(IDictionary dictionary) {
this.dictionary = dictionary;
}
public override bool TryGetMember(GetMemberBinder binder
, object[] indexes
, out object result) {
result = dictionary[binder.Name];
return dictionary.Contains(binder.Name);
}
public override bool TrySetMember(SetMemberBinder binder
, object[] indexes
, object value) {
dictionary[binder.Name] = value;
return dictionary.Contains(binder.Name);
}
public override bool TryGetIndex(GetIndexBinder binder
, object[] indexes
, out object result) {
result = dictionary[indexes[0]];
return dictionary.Contains(indexes[0]);
}
public override bool TrySetIndex(SetIndexBinder binder
, object[] indexes
, object value) {
dictionary[indexes[0]] = value;
return dictionary.Contains(indexes[0]);
}
private readonly IDictionary dictionary;
}
现在,我想将动态属性映射到 rule_name MailboxSC 的每一行,以便:
declare @emailCount int
declare @oldestDateTimeReceived datetime
select (
select valeur
from bqt001_pilotage_indicateurs
where nom_regle like 'boiteCourrielSC'
and type_valeur like 'nombreCourriels'
) as emailCount
, (
select valeur as olsdestDateTimeReceived
from bqt001_pilotage_indicateurs
where nom_regle like 'boiteCourrielSC'
and type_valeur like 'dateHeurePlusVieux'
) as oldestDateTimeReceived
into @emailCount
, @oldestDateTimeReceived
所以我得到了我需要的值、电子邮件数量和最早收到的日期/时间。
如何使用经典的 NHibernate XML 映射或 Fluent NHibernate 映射它?
Linked Ayende Rahien 的文章提供了第一种方法:
<class name="Customer"
table="Customers">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Name" />
<join table="Customers_Extensions" optional="false">
<key column="CustomerId"/>
<dynamic-component name="Attributes" access="field.lowercase">
<property name="EyeColor" type="System.String"/>
</dynamic-component>
</join>
</class>
所以我的猜测是:
<class name="EmailIndicatorModel">
<join table="MyTable" optional="false">
<dynamic-component name="Attributes" access="field.lowercase">
<property name="EmailCount" type="System.Int32" />
<property name="OldestDateTimeReceived" type="System.DateTime" />
<dynamic-component>
</join>
</class>
再说一次,这不允许我提及每个属性的鉴别器列 rule_name 和 value_type。
我是否注定要使用旧式 ADO.NET?
这里有一些关于我感兴趣的有趣文章:
【问题讨论】:
标签: c# nhibernate dynamic fluent-nhibernate