Frage

Dieser Titel ist ein ziemlich Bissen. Lassen Sie mich versuchen, so klar zu sein, wie ich kann ...

Ich habe einen WCF REST-Service in .NET 4 geschrieben, der die Entity Framework verwendet einige Daten aus SQL Server in eine Liste von Objekten zu ziehen. Die Objekte werden dann als XML an den Client zurückgegeben. Das Problem ist, dass die XML-Referenzen zueinander haben aufgrund meines Modells Beziehungen.

Hier ist ein Code, um Hilfe zu veranschaulichen das Problem:

Mein Modell: http://bara.stardock.com/images/activity_model.png

Die Aktivitäten Klasse, die Griffe der Dienstlogik:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Activities : IActivities
{
    public ActivitiesList GetActivities(string titleId, string accountId, string numToReturn)
    {
        stardockActivitiesEntities sdActivitiesDb = new stardockActivitiesEntities();

        int accountIdInt = int.Parse(accountId);

        List<Activity> items = (from a in sdActivitiesDb.Activities
                                join ab in sdActivitiesDb.ActivityBridges
                                    on a.ActivityID equals ab.ActivityID
                                where ab.AccountID == accountIdInt
                                select a).ToList();

        ActivitiesList list = new ActivitiesList(items);

        return list;
    }
}

Die Schnittstelle für die obige Klasse:

[ServiceContract]
public interface IActivities
{
    [OperationContract]
    [WebGet(UriTemplate = "{titleId}/accounts/{accountId}/limits/{numToReturn}")]
    ActivitiesList GetActivities(string titleId, string accountId, string numToReturn);
}

Die Aktivitätsklasse ist automatisch generiert durch die Rahmeneinheit auf der Grundlage meiner Modell für die Aktivitäten Tisch. Allerdings habe ich auf dieser Klasse erweitern, indem sie ein ActivitiesList Objekt erstellen:

[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
public partial class Activity
{

}

[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
[DataContract(IsReference=false)]
public class ActivitiesList
{
    [DataMember]
    public List<Activity> Activities { get; set; }

    public ActivitiesList()
    {
        Activities = new List<Activity>();
    }

    public ActivitiesList(List<Activity> list)
    {
        Activities = new List<Activity>();

        foreach (Activity item in list)
        {
            Activities.Add(item);
        }
    }

    public void Add(Activity a)
    {
        Activities.Add(a);
    }
}

Also mein Problem zu erklären noch einmal, meine XML, anstatt einfach nur eine Liste der Aktivität Rückkehr wie es soll, gibt stattdessen eine Liste von Aktivitäten mit einigen Aktivitäten andere Aktivitäten verweisen, die innerhalb der Basisaktivitäten. Das klingt verwirrend, aber Blick auf die Bilder unten:

Zurück XML: http://bara.stardock.com/images/activity_xml1.png

Die Aktivität mit einem Referenz von „i8“ bezieht sich auf eine andere Tätigkeit, die tatsächlich in der Aktivität mit der ID von „i2“ ist: http://bara.stardock.com/images/activity_xml2.png

Meine Frage ist, wie kann ich alle diese zusätzlichen Beziehungen aus dem Aktivitätsobjekt entfernen? Ich würde es vorziehen, nur eine Liste der Aktivität zu sein, ohne dass die verschachtelte Activity, EntityKey usw., die durch den Entity Framework automatisch generiert werden.

Ich hoffe, dass ich mich ausreichend erklärt habe. Und wenn nicht, lassen Sie mich wissen, was andere Details würden Sie gerne sehen, und ich werde sie zur Verfügung stellen.

Bara

War es hilfreich?

Lösung

Es gibt zwei Möglichkeiten, aber beide erfordern ein wenig Arbeit.

Meine Empfehlung wäre es, Wrapper-Klassen zu erstellen, die die entsprechenden Daten aussetzen und bringt sie statt.

  

return new PersonWrapper () {Id = Person.Id, Name = Person.Name};

PersonWrapper braucht nur automatische Eigenschaften, und Sie können exacty steuern, welche Daten Sie zurückkommen, und wie es zurückgegeben wird, die relevanten Eigenschaften verwendet wird.

Der alternative Vorschlag kommt von dieser exemplarischen Vorgehensweise: http://blogs.msdn.com/b/endpoint/archive/2010/01/07/getting-started-with-wcf-webhttp-services-in -Netz-4.aspx

Dies legt nahe, POCO-Klassen (die wiederum würden Sie manuell erstellen müssen) anstatt auf der Entity Framework Code-Generierung der Berufung, die Karte per Konvention (in den meisten Fällen) zu den Einheiten in der konzeptionellen Modell (weitere Informationen hier: http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx )

Die zweite Option erfordert, dass Sie die Codegenerierung deaktivieren, wenn Sie also nur auf auszusetzen ein paar Klassen zu planen, wäre es wahrscheinlich ein Schmerz sein, um die POCO Klassen manuell für jede Entität erstellen zu müssen, weshalb ich empfehlen würde die Schaffung Wrapper-Klassen nur für die Objekte, die ausgesetzt werden müssen

Martin

Andere Tipps

Ich denke, wenn man EF (4) verwenden Sie die Zuordnungen in dem Modell entfernen können (zum Beispiel in dem Designer), dass Sie nicht brauchen / wollen. Auf diese Weise wird der Code-Generator nicht Eigenschaften erzeugen, um die Beziehungen zu navigieren über.

Edit:. Durch Assoziationen meine ich die echte „Verbände“ (Linien im Diagramm) und Navigationseigenschaften (auf der Unterseite der Entitäten)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top