Archive

Posts Tagged ‘RIA Services’

Entity Framework 4 / POCO und RIA Services

August 3rd, 2010 No comments

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.

image

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;
}

image

Eigentlich etwas armselig, dass sowas überhaupt nötig ist – aber zumindest eine einigermassen komfortable Lösung.

Sharing Buttons by Linksku