Entity Framework 4 / POCO und RIA Services
RIA Services und Entity Framework 4 arbeiten ja eigentlich mühelos miteinander. Benutzt man aber POCO-Klassen im Entity Framework, geht dann plötzlich gar nichts mehr.
Da meckert also der Compiler “Cannot resolve ‘EntityState’”. EntityState ist ein Property, welches in der Klasse EntityObject definiert ist – welche in Nicht-Poco-Szenarien die Basisklasse aller Entities ist. Da die POCO’s natürlich nicht von dieser Klasse ableiten (und dies auch nicht tun sollen), ist hier eine Alternative gefragt.
Die ObjectContext-Instanz bietet Zugriff auf den ObjectStateManager. Mit dessen Methode “TryGetObjectStateEntry” kann man den EntityState jeder Entität herausfinden. Eine entsprechende Hilfsmethode könnte so aussehen:
private EntityState GetEntityState(object entity)
{
ObjectStateEntry stateEntry;
if (ObjectContext.ObjectStateManager.TryGetObjectStateEntry(entity, out stateEntry))
{
return stateEntry.State;
}
return EntityState.Detached;
}
Noch einfacher wirds, wenn die Entitäten eine gemeinsame Basis teilen (hier BaseEntity). Mit etwas ExtensionMethod-Magic lassen sich die notwendigen Anpassungen an der generierten Service-Klasse dann auch mit “Find and Replace” lösen:
private EntityState GetEntitySate(this EntityBase entity, ObjectStateManager stateManager)
{
ObjectStateEntry stateEntry;
if (stateManager.TryGetObjectStateEntry(entity, out stateEntry))
{
return stateEntry.State;
}
return EntityState.Detached;
}
Eigentlich etwas armselig, dass sowas überhaupt nötig ist – aber zumindest eine einigermassen komfortable Lösung.