Frage

Ich versuche, die Extensibility Methodendefinitionen aus meiner datacontext.designer.cs-Datei zu verwenden, um einige Validierung zu tun.

Also habe ich eine neue Datei und hinzugefügt diesen Code:

public partial class LawEnforcementDataContext : System.Data.Linq.DataContext
{

    partial void InsertCourse(Course instance) // this definition copied from generated file
    {
        ValidateCourse(instance);
        this.ExecuteDynamicInsert(instance);
    }

    partial void UpdateCourse(Course instance) // this definition copied from generated file
    {
        ValidateCourse(instance);
        this.ExecuteDynamicUpdate(instance);
    }

    private void ValidateCourse(Course instance)
    {
        if (instance.StartDate > instance.EndDate)
        {
            throw new ApplicationException("Start date cannot be later than end date.");
        }
    }
}

Ich kann nicht, weil dieser Fehler kompiliert:

Error   1   No defining declaration found for implementing declaration of partial method 'LawEnforcementDataContext.InsertCourse(reservation.lawenforcement.Course)'
Error   2   No defining declaration found for implementing declaration of partial method 'LawEnforcementDataContext.UpdateCourse(reservation.lawenforcement.Course)'

Ich sehe nicht, was ich falsch mache. Ich habe das schon mal gemacht. Auch nach den obigen Code hinzufügen, in Code, der die Klassen durch die LINQ to SQL erstellt verweist, es beschwert sich, dass meine Entitätstypen nicht mehr existieren. Es ist, als ob die partielle Klasse LawEnforcementDataContext vollständig über den generierten Code nehmen.

EDIT

Hier sind die anderen Hälften der Teil Erklärungen aus dem generierten Code:

    // the class
    public partial class LawEnforcementDataContext : System.Data.Linq.DataContext

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
War es hilfreich?

Lösung

Ihre zwei Teilklassen werden in einem anderen Namensraum definiert, so dass der Compiler nicht ‚teilen‘ sie.

Es gibt eine Einstellung unter Eigenschaften im DBML Designer für diese. Vielleicht setzen Sie ihn?

Andere Tipps

Um Felder in Linq zu validieren, müssen Sie die OnValidate Methode nicht die Insert & Update-Methoden implementieren.

Zum Beispiel:

partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        //All content items need titles
        if (Description == null || Description == "")
            throw new Exception("The description field is empty!");

        //Content types of image need...images
        if (ContentItemTypeId == (int)ContentItemTypes.Image && ImageData == null)
            throw new Exception("An image is required in order to save this content item!");

        //New Content Items don't have ids.  If a new one comes through, set the default values for it.
        if (this.ContentItemId == 0)
        {
            this.CreatedOn = DateTime.Now;
            this.LastUpdatedOn = DateTime.Now;
            this.IsDeletable = true;
        }
    }

Entfernen Sie die partial Stichwort von Ihren Methoden -. Die generierte Klasse keine Teil-Methoden hat

Edit: Partial Methoden funktionieren nur, wenn sie wie folgt definiert werden:

partial class Foo
{
    partial void foo();
}

partial class Foo
{
    partial void foo() { }
}

Eine der Erklärungen muss geschrieben werden, wie es eine abstrakte Methode oder Schnittstelle Methodendeklaration ist. Wenn die Compiler eine partielle Methode mit einer Implementierung finden und können nicht die passende partielle Methode Erklärung finden an anderer Stelle erzeugt es diesen Fehler.

Edit: Hier ist etwas zu prüfen - ist es möglich, dass der Parameter Course ist nicht genau die gleiche Art in einem der beiden Erklärungen? Mit anderen Worten ist es möglich, dass so etwas wie dies geschehen ist:

partial class Foo
{
    partial void foo(Biz.Parameter p);
}

partial class Foo
{
    partial void foo(Baz.Parameter p) { }
}

namespace Baz
{
    class Parameter { }
}

namespace Biz
{
    class Parameter { }
}

Dieser Fehler bedeutet, dass die partielle Methode Sie hat implementieren nicht in der LawEnforcementDataContext Klasse definiert.

sollten diese Methoden automatisch definiert, wenn Sie Tabellen in Ihrem Datacontext hinzufügen, suchen Sie in der generierten Quelle (wahrscheinlich LawEnforcement.designer.cs) für einen Bereich innerhalb der LawEnforcementDataContext Klasse markiert #region Extensibility Methodendefinitionen alle Teil Methoden definiert werden Hier. Ich erwarte, dass die Methoden fehlen werden, versuchen zu entfernen und erneut hinzufügen die Tabelle Course in Ihrem Linq Modell sie zu erzeugen.

Um zu klären, es ist die Klasse, die teilweise ist, nicht die Methoden in ihm -. Die Datacontext-Klasse, die von L2S eine partielle Klasse ist aber enthält keine Teilverfahren ** Korrektur unter **

Zur Klarstellung auf der Differenz von definieren und Umsetzung partieller Methode Erklärungen, dies könnte helfen .

Bearbeiten

Nun, ich nie - würde ich nicht „#region Extensibility Methode Definitionen“ Methoden gesehen / verwendet ... Sie lernen jeden Tag etwas! Wie auch immer, der Artikel I verknüpft ist eine nützliche Diskussion über die Teilverfahren in der Regel getrennt von L2S.

Ronnie, Ich lief in das gleiche Problem. Caveat. Seien Sie vorsichtig, wenn Sie mehrere Klassen in einer Einheit-Datei

Überprüfen Sie, wo die Teilklasse befindet:? Haben Sie versehentlich die Definition in den Datenkontext Klammern wie ich

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