POCO的代理是一個動態創建的類,從派生(繼承)一個POCO。它增加了先前在EntityObject
中發現的功能,即延遲加載和更改跟蹤,只要POCO符合requirements。 POCO或其代理不包含如問題所示的EntityObject
,而是代理包含EntityObject
的功能。您無法(AFAIK)將ModelBuilder與EntityObject派生類型結合使用,並且您無法從POCO或代理獲取底層EntityObject,因爲沒有這樣的實體對象。
我不知道是什麼的ObjectContext
功能?您現有的序列化和審計代碼中使用,但您可以通過鑄造DbContext
到IObjectContextAdapter
和訪問IObjectContextAdapter.ObjectContext
財產得到ObjectContext
從DbContext
。
編輯:在保存更改
1.訪問修改後的屬性是在ObjectStateEntry可用,並將它們保存到與舊的審計值和新值
您可以通過使用DbContext.ChangeTracker
實現這一目標與波蘇斯。首先,您撥打DbContext.ChangeTracker.DetectChanges
來檢測更改(如果您使用的代理服務器不是必需的,但不會受到傷害),然後使用DbCotnext.Entries.Where(e => e.State != EntityState.Unchanged && e.State != EntityState.Detached)
獲取DbEntityEntry
更改的實體列表以進行審覈。每個DbEntityEntry
具有OriginalValues
和CurrentValues
,並且實際實體在屬性Entity
中。
您還可以訪問ObjectStateEntry
,如下所示。
2.大多數的我們只需要檢查的導航屬性的任何條件,例如時間:
User.EmailAddresses.CreateSourceQuery().Any(x=> x.EmailAddress == givenAddress);
您可以利用IObjectContextAdapter如前所述使用CreateSourceQuery()用的DbContext。當你的ObjectContext你可以得到源查詢像這樣的相關結尾:
public static class DbContextUtils
{
public static ObjectQuery<TMember> CreateSourceQuery<TEntity, TMember>(this IObjectContextAdapter adapter, TEntity entity, Expression<Func<TEntity, ICollection<TMember>>> memberSelector) where TMember : class
{
var objectStateManager = adapter.ObjectContext.ObjectStateManager;
var objectStateEntry = objectStateManager.GetObjectStateEntry(entity);
var relationshipManager = objectStateManager.GetRelationshipManager(entity);
var entityType = (EntityType)objectStateEntry.EntitySet.ElementType;
var navigationProperty = entityType.NavigationProperties[(memberSelector.Body as MemberExpression).Member.Name];
var relatedEnd = relationshipManager.GetRelatedEnd(navigationProperty.RelationshipType.FullName, navigationProperty.ToEndMember.Name);
return ((EntityCollection<TMember>)relatedEnd).CreateSourceQuery();
}
}
這種方法不使用動態代碼是強類型的,因爲它使用的表達式。你可以這樣使用它:
myDbContext.CreateSourceQuery(invoice, i => i.details);
你可以添加一個你自定義屬性的例子嗎? – LunicLynx