EF 4.1如何获取实体的第一个密钥 - 复合

时间:2012-07-21 23:48:50

标签: entity-framework entity-framework-4

我有一个类,我有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();

string keyName = keyNames [0] .Name;

1 个答案:

答案 0 :(得分:0)

您只需将Single替换为First即可获取具有关键属性的第一个属性:

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;