1

我有一个类,我有 2 个键(复合键),然后我有我的审计日志功能,我曾经在其中获取这样的实体的主键:

string keyName = dbEntry.Entity.GetType().GetProperties().Single(p => p.GetCustomAttributes(typeof(KeyAttribute), false).Count() > 0).Name;

问题是我试图保存的模型之一有一个复合键:

 [Key,Column("paymentdetailid", TypeName = "int", Order=0)]
    public Int32 PaymentDetailId { get; set; }

    [Key,Column("chargedetailid", TypeName = "int", Order=1)]
    public Int32 ChargeDetailId { get; set; }

尝试获取 keyName 时出现以下错误:

Sequence contains more than one matching element 

关于如何解决这个问题的任何线索?我只想拿到第一把钥匙。

谢谢,

解决方案

解决方案是这个:

var keyNames = dbEntry.Entity.GetType().GetProperties().Where(p => p.GetCustomAttributes(typeof(KeyAttribute), false).Count() > 0).ToList();

字符串 keyName = keyNames[0].Name;

4

1 回答 1

0

您可以替换SingleFirst以获取具有关键属性的第一个属性:

string keyName = dbEntry.Entity.GetType().GetProperties().First(
    p => p.GetCustomAttributes(typeof(KeyAttribute), false).Any()).Name;

Any()Count() > 0它只是说“检查属性是否具有关键属性”要干净一些。或者FirstOrDefault,如果您想捕获该类型根本没有键属性并抛出适当的异常的情况(FirstOrDefault将返回null然后First将抛出“序列不包含元素”异常):

var property = dbEntry.Entity.GetType().GetProperties().FirstOrDefault(
    p => p.GetCustomAttributes(typeof(KeyAttribute), false).Any());

if (property == null)
    throw new InvalidOperationException(string.Format(
        "Entity {0} has no [Key] attribute.", dbEntry.Entity.GetType().Name));

string keyName = property.Name;
于 2012-07-22T14:47:56.073 回答