2011-08-31 9 views

cevap

24

Çok size DbContext tarafından gizlenmiş biraz daha gelişmiş özelliklere erişim veren yatan ObjectContext erişebilir senin DbContextIObjectContextAdapter için döküm gerekir.

Sınıfınızın içinde bulunan DbContext aşağıdaki yöntem işe yarayacaktır. Birden fazla anahtar varsa

object GetPrimaryKeyValue(DbEntityEntry entry) 
{ 
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity); 
    return objectStateEntry.EntityKey.EntityKeyValues[0].Value; 
} 

o zaman EntityKeyValues mülkiyet üzerinde yineleme gerekir.

+4

. Ayrılmış bir girişin varlık anahtarını almanın bir yolu var mı? – Shimmy

+1

Aynı sorunu yaşıyorum. ObjectStateManager'a başvurduğumda bu hatayı alıyorum. ObjectStateManager, 'NAME_OF_ENTITY' – Hemslingo

+0

@Shimmy türünde bir nesneye başvuru içeren bir ObjectStateEntry içermiyor, cevabıma bakın – toddmo

0

Ayrıca bir varlığın Birincil Anahtarını bulmak için arıyorum. Depodaki Generics'i kullanıyorum, bu nedenle çalışma zamanına kadar Varlığı bilmiyorum. Bunu şu ana kadar yapmamın tek yolu bir sql ifadesidir.

public abstract class GenericRepository<T> : ApiController,IGenericRepository<T> where T : class 
{ 


    string sqlstr = @" 
     SELECT COLUMN_NAME 
     FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
     WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1 
     AND TABLE_NAME = '" + typeof(T).ToString() + "' AND TABLE_SCHEMA = 'dbo'"; 

    private Entities _entities = new Entities(); 


    public virtual IQueryable<T> GetAll() 
    { 
     DbSqlQuery<T> queryTest = _entities.Set<T>().SqlQuery(sqlstr); 

Bu tam sınıfın sadece bir pratial ama umarım ben kullanıyorum çözümü gösterir.

0

Ekli T item'a ihtiyacınız yoktur. Bu uzunca sarılmış olabilir, ama işe yarıyor.

public object[] GetPrimaryKeyValues<T>(DbContext databaseContext, T item) 
{ 
    return ((IObjectContextAdapter)databaseContext).ObjectContext.CreateEntityKey(typeof(T).Name.Pluralize(), item).EntityKeyValues.Select(kv => kv.Value).ToArray(); 
} 

dönüş türü, örneğin, bir Find kullanmak için uygundur. Bakın, anahtar değerler aslında bir dizi nesnedir. Eğer pluralize() gerekiyorsa

, işte burada: varlık `ObjectStateManager` bulunuyorsa çalışır Yani

using System; 
using System.Data.Entity.Design.PluralizationServices; 
using System.Linq; 
using System.Reflection; 

namespace Atlas.Core.Kernel.Extensions 
{ 
    public static class Strings 
    { 
     private static PluralizationService pluralizationService = PluralizationService.CreateService(System.Globalization.CultureInfo.CurrentUICulture); 
     public static string Pluralize(this MemberInfo memberInfo)//types, propertyinfos, ect 
     { 
     return Pluralize(memberInfo.Name.StripEnd()); 
     } 

     public static string Pluralize(this string name) 
     { 
     return pluralizationService.Pluralize(name); // remove EF type suffix, if any 
     } 



    } 
    }