【问题标题】:Finding the Primary Key from a ClassMap<T>从 ClassMap<T> 中查找主键
【发布时间】:2012-04-09 06:24:49
【问题描述】:

使用Fluent NHibernate,我有一个任意的ClassMap&lt;T&gt;,我希望能够找出设置为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

编辑:2012 年 1 月 10 日

我最初想要这个是因为我想知道数据库中是否存在一个分离的实体,仅基于主键(因此我需要知道主键成员,而不是字符串)。我设置了这条路径,因为很多这样的代码已经存在于我们的代码库中。在重新考虑这个问题之后,我意识到映射应该已经解决了这个问题,所以使用 NHibernate.Linq 我知道有这个:

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

【问题讨论】:

  • 为什么需要在 C# 代码中获取 PK 的列名?

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

所以...我用Reflector 检查了Fluent-Nhibernate 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;
 }

按 viggity 编辑

这就是我真正想要的。再次感谢!

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”列名。

我必须说我很想知道你为什么需要它。

【讨论】:

  • 我已经根据推理和实际解决原始问题的方式编辑了我的问题。我已将您的答案标记为已接受,因为它成功回答了原始问题。谢谢gdoron!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多