LINQ to SQL: error de compilación al extender el contexto de datos con clases y métodos parciales

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

Pregunta

Estoy tratando de usar las Definiciones de métodos de extensibilidad de mi archivo datacontext.designer.cs para hacer alguna validación.

Así que creé un nuevo archivo y agregué este código:

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

No puedo compilar debido a estos errores:

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

No veo lo que estoy haciendo mal. He hecho esto antes. Además, después de agregar el código anterior, en el código que hace referencia a las clases creadas por LINQ to SQL, se queja de que mis tipos de entidad ya no existen. Es como si la clase parcial LawEnforcementDataContext asumiera completamente el código generado.

EDITAR

Aquí están las otras mitades de las declaraciones parciales del código generado:

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

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
¿Fue útil?

Solución

Sus dos clases parciales se definen en diferentes espacios de nombres, por lo que el compilador no las 'comparte'.

Hay una configuración en Propiedades en el diseñador DBML para esto. ¿Quizás se restablece?

Otros consejos

Para validar campos en Linq, debe implementar el método OnValidate, no Insert & amp; Métodos de actualización.

Por ejemplo:

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

Elimine la palabra clave partial de sus métodos; la clase generada no tiene ningún método parcial.

Editar: Los métodos parciales solo funcionan cuando se definen así:

partial class Foo
{
    partial void foo();
}

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

Una de las declaraciones debe escribirse como si fuera un método abstracto o una declaración de método de interfaz. Si el compilador encuentra un método parcial con una implementación y no puede encontrar la declaración del método parcial correspondiente en otro lugar, genera este error.

Editar: Aquí hay algo para verificar: ¿es posible que el parámetro Course no sea exactamente el mismo tipo en una de las dos declaraciones? En otras palabras, es posible que haya sucedido algo como esto:

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

Ese error significa que el método parcial que está implementando no se ha definido en la clase LawEnforcementDataContext.

Estos métodos deben definirse automáticamente cuando agrega tablas a su DataContext, busque en la fuente generada (probablemente LawEnforcement.designer.cs) una región dentro de la clase LawEnforcementDataContext etiquetada como #region Definiciones de métodos de extensibilidad Todos los métodos parciales serán definidos aquí. Espero que falten los métodos, intente eliminar y volver a agregar la tabla del curso en su modelo Linq para generarlos.

Para aclarar, es la clase la que es parcial, no los métodos dentro de ella: la clase DataContext generada por L2S es una clase parcial pero no contiene ningún método parcial ** corrección a continuación **.

Para aclarar la diferencia entre definir y implementar declaraciones de métodos parciales, esto podría ayudar .

Editar

Bueno, yo nunca - no había visto / usado '' #region Extensibility Method Definitions '' métodos antes ... ¡aprendes algo todos los días! De todos modos, el artículo al que me vinculé es una discusión útil sobre métodos parciales en general, separados de L2S.

Ronnie, Me encontré con este mismo problema. Advertencia: Tenga cuidado cuando tenga varias clases en un archivo de entidad.

Verifique dónde se encuentra la clase parcial: ¿Puso accidentalmente la definición dentro de los corchetes del contexto de datos como lo hice yo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top