2012-02-14 14 views
5

bir varlık çerçevesi 4,0 kod ilk varlıkDBContext'e bağlanmadan önce EF 4 kodunu ilk varlığın [Key] özelliğini yalnızca özniteliğe nasıl alırsınız?

public class MyEntity 
{ 
    [Key] 
    public int MyEntityId { get; set; } 
} 

tesisin adını bilmeden [Anahtar] özniteliği ile dekore özelliğin değerini almak için bir yol var mı Verilen?

public class KeyReader<TEntity> : where TEntity : class 
{ 
    public int GetKeyValue(TEntity entity){ 
    //get key value for entity 
    } 
} 

GÜNCELLEME

Bir DBContext var, bu yüzden aşağıdaki kodu kullanabilirsiniz:

var objectContext = ((IObjectContextAdapter) myContext).ObjectContext; 
objectContext.ObjectStateManager.GetObjectStateEntry(entity).EntityKey.EntityKeyValues; 

Ancak varlık sonra bu sadece çalışır eklenen veya DBContext bağlı olmuştur . Sorun, bir ekleme veya güncellemenin gerçekleştirilip gerçekleştirilmeyeceğini ve dolayısıyla içeriğe eklenip eklenmeyeceğini belirlemek için anahtarın ve değerinin dinamik bilgisini kullanmak istediğimdi. Bu kod mümkün olduğunda, bu çok geç.

Bunu yansıtmak için soru başlığını düzenledim.

Herhangi başka düşünceler? Eğer varlık parçasıdır ObjectContext varsa

cevap

7

Başka bir olası çözüm [Key] özniteliği ile süslüdür özelliği bulmak için yansıma kullanmak olacaktır ve değerini döndürmek için: Bu yöntem yalnızca ilk özelliğinin değer dönecektir

private object GetKeyValue<T>(T entity) where T : class 
{ 
    PropertyInfo key = 
     typeof(T) 
     .GetProperties() 
     .FirstOrDefault(p => p.GetCustomAttributes(typeof(KeyAttribute), true).Length != 0); 

    return key != null ? key.GetValue(entity, null) : null; 
} 

MyEntity instanceOfMyEntity = new MyEntity { MyEntityId = 999; }; 
object keyValue = GetKeyValue<MyEntity>(instanceOfMyEntity); // keyValue == 999 

Not hangi KeyAttribute ile dekore edilmiş ve bir anahtar özelliği bulunamazsa null döndürecektir.

3

, sen YourContext.GetObjectStateEntry(entity) çağırabilir. Bu, anahtar değerlerini saklayan EntityKey özelliğine sahip ilgili ObjectStateEntry nesnesini döndürür.

Eğer DbContext kullanıyorsanız, ben de benzer bir işlev görmüyorum. Ancak, bir tane olmasa bile, yine de IObjectContextAdapter (((IObjectContextAdapter)YourContext).ObjectContext) altında yatan ObjectContext almak için kullanabilir ve ardından yukarıdaki kullanın.

+0

Bu doğrudur ama bu temel amacını çözümünde yardımcı olduğu neden olarak benim güncelleme göreceksiniz. Yine de oy verdim, çünkü öneriyi takdir ediyorum. –

+0

Siz * ekleyebilir, anahtar değerlerini almak için bunu kullanabilirsiniz, eğer eklemiş olmanız gerektiğini görürseniz, 'ObjectStateEntry.ChangeState (EntityState.Added)' öğesini çağırın. Ama gerçekten, bu yanlış bir şey yapıyor, yanlış yapıp yapmadığınızı kontrol ediyor ve düzeltiyor. Kabul ettiğin cevap muhtemelen daha iyi bir fikir. – hvd

İlgili konular