LINQ to SQL - Erreur de compilation lors de l'extension du contexte de données avec une classe et des méthodes partielles

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

Question

J'essaie d'utiliser les définitions de méthode d'extensibilité de mon fichier datacontext.designer.cs pour effectuer certaines validations.

J'ai donc créé un nouveau fichier et ajouté le code suivant:

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

Je ne peux pas compiler à cause de ces erreurs:

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

Je ne vois pas ce que je fais mal. Je l'ai fait avant. De même, après avoir ajouté le code ci-dessus, dans le code qui référence les classes créées par LINQ to SQL, il se plaint que mes types d'entité n'existent plus. C'est comme si la classe partielle LawEnforcementDataContext reprenait complètement le code généré.

EDIT

Voici les autres moitiés des déclarations partielles du code généré:

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

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
Était-ce utile?

La solution

Vos deux classes partielles sont définies dans des espaces de noms différents, de sorte que le compilateur ne les "partage" pas.

Il existe un paramètre sous Propriétés dans le concepteur DBML pour cela. Peut-être qu'il se réinitialise?

Autres conseils

Pour valider les champs dans Linq, vous devez implémenter la méthode OnValidate et non la méthode Insert & amp; Méthodes de mise à jour.

Par exemple:

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

Supprimez le mot clé partial de vos méthodes - la classe générée n'a aucune méthode partielle.

Modifier: les méthodes partielles ne fonctionnent que lorsqu'elles sont définies comme suit:

partial class Foo
{
    partial void foo();
}

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

Une des déclarations doit être écrite comme s'il s'agissait d'une méthode abstraite ou d'une déclaration de méthode d'interface. Si le compilateur trouve une méthode partielle avec une implémentation et ne trouve pas la déclaration de méthode partielle correspondante ailleurs, il génère cette erreur.

Modifier: Voici une chose à vérifier: est-il possible que le paramètre Course ne soit pas exactement du même type dans l'une des deux déclarations? En d'autres termes, est-il possible que quelque chose comme ceci se soit produit:

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

Cette erreur signifie que la méthode partielle que vous implémentez n'a pas été définie dans la classe LawEnforcementDataContext.

Ces méthodes doivent être automatiquement définies lorsque vous ajoutez des tables dans votre DataContext, recherchez dans la source générée (probablement LawEnforcement.designer.cs) une région de la classe LawEnforcementDataContext intitulée #region. Méthode de l'extensibilité. Toutes les méthodes partielles seront définies. ici. J'espère que les méthodes vont manquer, essayez de supprimer et de ré-ajouter la table Course dans votre modèle Linq pour les générer.

Pour clarifier, c'est la classe qui est partielle, pas les méthodes qu'il contient - la classe DataContext générée par L2S est une classe partielle mais ne contient aucune méthode partielle ** correction ci-dessous **.

Pour plus de précisions sur la différence entre définir et mettre en œuvre des déclarations de méthodes partielles, cela pourrait aider .

Modifier

Eh bien, je n'ai jamais vu ou utilisé "#region Extensibility, méthode, définitions" " méthodes avant ... vous apprenez quelque chose tous les jours! Quoi qu’il en soit, l’article auquel je me suis associé est une discussion utile sur les méthodes partielles en général, distincte de L2S.

Ronnie, Je viens de rencontrer ce même problème. Avertissement: soyez prudent lorsque vous avez plusieurs classes dans un fichier d'entité.

Vérifiez où se situe la classe partielle: avez-vous accidentellement placé la définition dans les crochets du contexte de données, comme je l'ai fait?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top