1

私は2つのキー(複合キー)を持つクラスを持っています。次に、次のようなエンティティの主キーを取得するために使用した監査ログ関数を持っています:

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

問題は、保存しようとしているモデルの 1 つに複合キーがあることです。

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

4

1 に答える 1

0

に置き換えるだけで、キー属性を持つ最初のプロパティを取得Singleできます。First

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

また、「プロパティキー属性があるかどうかを確認する」とだけ書かれているAny()よりも少しきれいです。または、タイプにキー属性がまったくない場合をキャッチし、適切な例外をスローする場合に使用します(その場合、「シーケンスに要素が含まれていません」例外がスローされます):Count() > 0FirstOrDefaultFirstOrDefaultnullFirst

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 に答える