我有一个类,我有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;
答案 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;