Böyle bir yöntem var mı?İlk olarak koddaki keyfi bir öğenin birincil anahtar değerini alın
object GetPrimaryKeyValue(DbEntityEntry entry);
Ya da nasıl uygulanmalı?
Böyle bir yöntem var mı?İlk olarak koddaki keyfi bir öğenin birincil anahtar değerini alın
object GetPrimaryKeyValue(DbEntityEntry entry);
Ya da nasıl uygulanmalı?
Çok size DbContext
tarafından gizlenmiş biraz daha gelişmiş özelliklere erişim veren yatan ObjectContext
erişebilir senin DbContext
IObjectContextAdapter
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.
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.
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
}
}
}
. Ayrılmış bir girişin varlık anahtarını almanın bir yolu var mı? – Shimmy
Aynı sorunu yaşıyorum. ObjectStateManager'a başvurduğumda bu hatayı alıyorum. ObjectStateManager, 'NAME_OF_ENTITY' – Hemslingo
@Shimmy türünde bir nesneye başvuru içeren bir ObjectStateEntry içermiyor, cevabıma bakın – toddmo