寻找从ClassMap&LT主键; T> [英] Finding the Primary Key from a ClassMap<T>

查看:189
本文介绍了寻找从ClassMap&LT主键; T>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用功能NHibernate ,我有一个任意 ClassMap< T> ,我希望能够找出什么属性(如果有的话)被设置为主键



例如:

 公共类PersonMap:ClassMap<&人GT; 
{
公共PersonMap()
{
编号(P => p.StupidPrimaryKeyId).GeneratedBy.Identity()列(StupidPrimaryKeyId);
}
}

...

//使用
的MemberInfo primaryKeyMember = FindPrimaryKey(新PersonMap());



谁能告诉我什么方法体 FindPrimaryKey 将不得不为了回报 StupidPrimaryKeyId



编辑:12年1月10日



我本来想这是因为我想知道在数据库中是否不存在一个独立的实体,完全基于主键(因此我需要知道主键成员,而不是字符串)。我将沿着这条道路,因为很多这样的代码,在我们的代码基础已经存在。重新思考这个问题之后,我反而意识到映射应该已经采取照顾,因此,使用NHibernate.Linq我知道有这样的:

 公共虚拟BOOL RecordExists(TRecord OBJ)
{
变种存在= _session.Query< TRecord>()式(R => R == OBJ)。任何();
收益存在虚假==;
}


解决方案

所以...我检查流利,NHibernate的反射 DLL和这是我来到-了:

 公共字符串FindPrimaryKey< T>(ClassMap< T>图)
{
VAR providersInfo = map.GetType()BaseType.GetField。 (供应商,BindingFlags.Instance | BindingFlags.NonPublic可);
VAR providersValue =(MappingProviderStore)providersInfo.GetValue(图)
变种n = providersValue.Id
VAR PKName =((名单<字符串方式>)Id.GetType()getfield命令(列,BindingFlags.Instance | BindingFlags.NonPublic可)
.GetValue (ID))的SingleOrDefault();
返回PKName;
}

按viggity修改



这是我真的很期待的。 !再次感谢

  public成员FindPrimaryKey< T>(ClassMap< T>图)
{
变种providersInfo = map.GetType()BaseType.GetField(供应商,BindingFlags.Instance | BindingFlags.NonPublic可)。
VAR providersValue =(MappingProviderStore)providersInfo.GetValue(图)
VAR ID = providersValue.Id;
VAR pkMemberInfo =(会员)id.GetType()getfield命令(成员​​,BindingFlags.Instance | BindingFlags.NonPublic可).GetValue(ID)。
返回pkMemberInfo;
}



最终修改



PKName(如果明确指定了列名)将获得StupidPrimaryKeyId列名。



我必须说,我很好奇,知道为什么你需要它。


With Fluent NHibernate, I have an arbitrary ClassMap<T>, I want to be able to find out what property (if any) was set as the primary key.

Example:

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(p => p.StupidPrimaryKeyId).GeneratedBy.Identity().Column("StupidPrimaryKeyId");
    }
}

...

//usage
MemberInfo primaryKeyMember = FindPrimaryKey(new PersonMap());

Can anybody tell me what the method body for FindPrimaryKey would have to be in order to return StupidPrimaryKeyId?

Edit: 1/10/12

I originally wanted this because I wanted to know whether or not a detached entity existed in the database, based solely on the primary key (thus my need for knowing the primary key member, not string). I set down this path because a lot of this code already existed in our code base. After rethinking the issue, I've instead realized that the mapping should already take care of that, so using NHibernate.Linq I know have this:

public virtual bool RecordExists(TRecord obj)
{
    var exists = _session.Query<TRecord>().Where(r => r == obj).Any();
    return exists == false;
}

解决方案

So... I inspected Fluent-Nhibernate dll with Reflector and this is what I came-up with:

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;
 }

Edit by viggity

This is what I was really looking for. Thanks again!

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;
}

end edit

PKName (if the column name assigned explicitly) will obtain the "StupidPrimaryKeyId" column name.

I must say that I'm curious to know why do you need it.

这篇关于寻找从ClassMap&LT主键; T&GT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆