實體框架可以輕鬆跟蹤兩個實體之間關係的更改。下面將返回ObjectStateEntry情況下爲所有加入和刪除的關係:實體框架:跟蹤對獨立關聯的更改
ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Deleted)
.Where(e => e.IsRelationship);
對於審計目的,我想檢索每個關聯端的以下信息:
- 導航屬性的名稱(如果有的話)
- 多重性
對於添加的關聯ObjectStateEntry實例包含兩個實體涉及的EntityKey對象d的關係:
var key0 = entry.CurrentValues[0] as EntityKey;
var key1 = entry.CurrentValues[1] as EntityKey;
還引用了代表當前關係類型:
var relationshipType = objectStateEntry.EntitySet.ElementType;
我所試圖做的是地圖中的每個實體按鍵(KEY0,KEY1)以適當末端關聯(relationshipType.KeyMembers)。據我所知,做到這一點的唯一方法是查看每個關聯端的引用類型,並將其與實體關鍵字所表示的實體的類型進行匹配。但是,如果關聯的兩端引用相同的實體類型(認爲僱員實體與經理FK引用另一個員工),則這不起作用。
所以這裏是幫助函數,我到目前爲止獲取導航屬性名稱和關係的多樣性結束。有沒有更好的方法來做同樣的事情?
public static string GetNavigationPropertyName(
this ObjectStateEntry entry, EntityKey key)
{
var relationshipType = entry.EntitySet.ElementType;
var entitySet = key.GetEntitySet(
entry.ObjectStateManager.MetadataWorkspace);
var property = entitySet.ElementType.NavigationProperties.Where(
p => p.RelationshipType == relationshipType)
.SingleOrDefault();
if (property == null)
{
return null;
}
return property.Name;
}
public static RelationshipMultiplicity GetAssociationEndMultiplicity(
this ObjectStateEntry entry, EntityKey key)
{
var relationshipType = entry.EntitySet.ElementType;
var entitySet = key.GetEntitySet(
entry.ObjectStateManager.MetadataWorkspace);
foreach (EdmMember member in relationshipType.KeyMembers)
{
var refType = member.TypeUsage.EdmType as RefType;
if (refType.ElementType == entitySet.ElementType)
{
var relEndMember = member as RelationshipEndMember;
return relEndMember.RelationshipMultiplicity;
}
}
throw new InvalidOperationException(
"couldn't find association end");
}
歡迎任何建議/想法。
感謝, 丹尼爾
您好,我可以似乎找不到ValidateBelongsTo方法。能否請你幫忙。 – SolarX 2011-09-20 09:13:29
我用ValidateBelongsTo更新了帖子。它是一個完整的檢查,但沒有做任何工作。 – LeffeBrune 2011-09-20 19:21:50