LINQ to SQL: errore di compilazione durante l'estensione del contesto dei dati con classe e metodi parziali

StackOverflow https://stackoverflow.com/questions/611745

Domanda

Sto tentando di utilizzare le definizioni del metodo di estensibilità dal mio file datacontext.designer.cs per effettuare una convalida.

Quindi ho creato un nuovo file e ho aggiunto questo codice:

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.");
        }
    }
}

Non riesco a compilare a causa di questi errori:

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)'

Non vedo cosa sto facendo di sbagliato. L'ho già fatto prima. Inoltre, dopo aver aggiunto il codice sopra riportato, nel codice che fa riferimento alle classi create da LINQ su SQL, si lamenta che i tipi di entità non esistono più. È come se la classe parziale LawEnforcementDataContext occupasse completamente il codice generato.

Modifica

Ecco le altre metà delle dichiarazioni parziali dal codice generato:

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

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
È stato utile?

Soluzione

Le tue due classi parziali sono definite in spazi dei nomi diversi, quindi il compilatore non le "condivide".

Esiste un'impostazione in Proprietà nella finestra di progettazione DBML per questo. Forse è resettato?

Altri suggerimenti

Per convalidare i campi in Linq, è necessario implementare il metodo OnValidate e non Inserisci & amp; Metodi di aggiornamento.

Ad esempio:

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

Rimuovi la parola chiave parziale dai tuoi metodi - la classe generata non ha metodi parziali.

Modifica: i metodi parziali funzionano solo quando sono definiti in questo modo:

partial class Foo
{
    partial void foo();
}

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

Una delle dichiarazioni deve essere scritta come se fosse un metodo astratto o una dichiarazione del metodo di interfaccia. Se il compilatore trova un metodo parziale con un'implementazione e non riesce a trovare la dichiarazione del metodo parziale corrispondente altrove, genera questo errore.

Modifica: Ecco qualcosa da verificare: è possibile che il parametro Course non sia lo stesso tipo esatto in una delle due dichiarazioni? In altre parole è possibile che sia successo qualcosa del genere:

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

Questo errore indica che il metodo parziale che stai implementando non è stato definito nella classe LawEnforcementDataContext.

Questi metodi dovrebbero essere definiti automaticamente quando si aggiungono tabelle in DataContext, si cerca nel sorgente generato (probabilmente LawEnforcement.designer.cs) una regione all'interno della classe LawEnforcementDataContext etichettata #region Definizioni del metodo di estensibilità tutti i metodi parziali saranno definiti Qui. Mi aspetto che manchino i metodi, prova a rimuovere e aggiungere nuovamente la tabella del corso nel tuo modello Linq per generarli.

Per chiarire, è la classe che è parziale, non i metodi al suo interno - la classe DataContext generata da L2S è una classe parziale ma non contiene metodi parziali ** correzione di seguito **.

Per chiarimenti sulla differenza tra definizione e attuazione dichiarazioni del metodo parziale, questo potrebbe aiutare .

Modifica

Beh, non l'ho mai visto - non avevo visto / usato " #region Metodo di estensibilità Definizioni " metodi prima ... impari qualcosa ogni giorno! Ad ogni modo, l'articolo che ho collegato è un'utile discussione sui metodi parziali in generale, separati da L2S.

Ronnie, Ho appena incontrato questo stesso problema. Avvertenza: prestare attenzione quando si hanno più classi in un file di entità.

Controlla dove si trova la classe parziale: hai inserito accidentalmente la definizione tra parentesi del contesto dati come ho fatto io?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top