11
A
回答
24
您需要將您的DbContext
轉換爲IObjectContextAdapter
,以便您可以訪問底層ObjectContext
,從而使您可以訪問由DbContext
隱藏的一些更高級功能。
在你的班級裏面派生DbContext
下面的方法會起作用。
object GetPrimaryKeyValue(DbEntityEntry entry)
{
var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
}
如果有一個以上的密鑰,那麼你應該遍歷EntityKeyValues
財產。
0
我也在尋找一個實體的主鍵。我在我的存儲庫中使用泛型,因此直到運行時才知道實體。我發現迄今爲止做到這一點的唯一方法是使用sql語句。
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);
這只是一個完整的類的祈禱,但希望顯示我正在使用的解決方案。
0
您不需要附上T item
。這可能是漫長的,但它的工作原理。例如,
public object[] GetPrimaryKeyValues<T>(DbContext databaseContext, T item)
{
return ((IObjectContextAdapter)databaseContext).ObjectContext.CreateEntityKey(typeof(T).Name.Pluralize(), item).EntityKeyValues.Select(kv => kv.Value).ToArray();
}
返回類型適用於Find
。看,鍵值實際上是一個對象數組。
如果你需要以複數(),那就是:
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
}
}
}
相關問題
- 1. 實體框架外鍵作爲主鍵代碼第一個
- 2. 實體框架 - 代碼第一 - 一個與共享主鍵
- 3. 實體框架代碼第一個主鍵約束名稱
- 4. 實體框架6.0代碼第一 - 按主鍵
- 5. 實體框架代碼第一。查找主鍵
- 6. 代碼兩個實體之間的第一個外鍵
- 7. 實體框架代碼第一個 - 沒有主鍵的抽象模型類
- 8. 無法映射實體。獲取一個實體給第一個實體列中的第二個實體的列
- 9. ASP.NET實體框架代碼gridview上的第一個外鍵
- 10. 實體框架代碼第一個IQueryable
- 11. 實體框架代碼第一個GenericTypeArguments
- 12. 代碼第一個實體框架和外鍵
- 13. 實體框架代碼第一個外鍵問題
- 14. 外鍵缺失 - 實體框架代碼第一個
- 15. 實體框架代碼第一個外鍵添加索引
- 16. asp.net實體框架代碼第一個外鍵不能檢索
- 17. 實體框架代碼第一種方法獲取「主鍵所需」的錯誤表
- 18. xml_grep獲取第一個實例的值
- 19. 休眠 - 使用任何一個主鍵獲取具有複合主鍵的實體
- 20. 代碼第一個外鍵
- 21. 從第二個實體獲取數據來自一個實體
- 22. 2個實體的一個主鍵(ERD)
- 23. JPA映射:主鍵是一個實體的複合主鍵和其他實體的一個主鍵的複合
- 24. 實體框架代碼第一個和實體跟蹤
- 25. 設計代碼第一個實體框架實體框架
- 26. 實體框架代碼第一個只讀實體
- 27. 將表格乘以實體框架代碼中的單個實體第一個
- 28. 實體框架4.1代碼第一外鍵ID的
- 29. 帶實體框架代碼的外鍵第一種方法
- 30. 實體框架代碼第一個WPF - 取消更改
,只有當在'ObjectStateManager'存在的實體運作。有沒有辦法獲得分離條目的實體鍵? – Shimmy
我有同樣的問題。每當我引用ObjectStateManager時,我都會得到這個錯誤。 ObjectStateManager不包含引用'NAME_OF_ENTITY'類型對象的ObjectStateEntry, – Hemslingo
@Shimmy,請參閱我的回答 – toddmo