使用Fluent NHibernate
,我有一个ClassMap<T>
,我希望能够找出哪个属性(如果有)被设置为primary key
。
示例:
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(p => p.StupidPrimaryKeyId).GeneratedBy.Identity().Column("StupidPrimaryKeyId");
}
}
...
//usage
MemberInfo primaryKeyMember = FindPrimaryKey(new PersonMap());
有人可以告诉我FindPrimaryKey
的方法体必须是什么才能返回StupidPrimaryKeyId
?
编辑:1/10/12
我原本想要这个,因为我想知道数据库中是否存在一个分离的实体,仅仅基于主键(因此我需要知道主键成员,而不是字符串)。我设置了这条路径,因为很多代码已存在于我们的代码库中。在重新思考问题之后,我反而意识到映射应该已经处理好了,所以使用NHibernate.Linq我知道有这个:
public virtual bool RecordExists(TRecord obj)
{
var exists = _session.Query<TRecord>().Where(r => r == obj).Any();
return exists == false;
}
答案 0 :(得分:2)
所以...我用Fluent-Nhibernate
检查了Reflector
dll,这就是我提出来的:
public string FindPrimaryKey<T>(ClassMap<T> map)
{
var providersInfo = map.GetType().BaseType.GetField("providers", BindingFlags.Instance | BindingFlags.NonPublic);
var providersValue = (MappingProviderStore) providersInfo.GetValue(map);
var Id = providersValue.Id
var PKName = ((List<string>) Id.GetType().GetField("columns", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(Id)).SingleOrDefault();
return PKName;
}
以节奏编辑
这就是我真正想要的。再次感谢!
public Member FindPrimaryKey<T>(ClassMap<T> map)
{
var providersInfo = map.GetType().BaseType.GetField("providers", BindingFlags.Instance | BindingFlags.NonPublic);
var providersValue = (MappingProviderStore) providersInfo.GetValue(map);
var id = providersValue.Id;
var pkMemberInfo = (Member)id.GetType().GetField("member", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(id);
return pkMemberInfo;
}
结束修改
PKName(如果明确指定列名)将获得“StupidPrimaryKeyId”列名。
我必须说我很想知道你为什么需要它。