LINQ para SQL - erro de compilação quando se estende contexto de dados com a classe e métodos parcial

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

Pergunta

Eu estou tentando usar o método de extensibilidade Definições do meu arquivo datacontext.designer.cs fazer alguma validação.

Então, eu criei um novo arquivo e acrescentou 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.");
        }
    }
}

Não consigo compilar porque desses erros:

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

Não vejo o que estou fazendo de errado. Eu já fiz isso antes. Além disso, depois de adicionar o código acima, no código que referencia as classes criadas pelo LINQ to SQL, ele reclama que os meus tipos de entidade não existem mais. É como se a classe LawEnforcementDataContext parcial é completamente assumir o código gerado.

Editar

Aqui estão as outras metades das declarações parciais do código gerado:

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

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

Solução

As suas duas classes parciais são definidos em diferentes espaços de nomes, então o compilador não 'share' eles.

Há uma configuração em Propriedades no designer DBML para isso. Talvez redefinir?

Outras dicas

A fim de campos Validar na Linq, você precisa implementar o método OnValidate não a inserção e atualização em métodos.

Por exemplo:

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

Remova a palavra-chave partial de seus métodos -. A classe gerada não tem nenhum métodos parciais

Editar: métodos parciais só trabalho quando eles são definidos como este:

partial class Foo
{
    partial void foo();
}

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

Uma das declarações precisa ser escrito como se trata de um método ou método de interface declaração abstrato. Se o compilador encontra um método parcial com uma implementação e não pode encontrar o correspondente declaração de método parcial em outros lugares que gera este erro.

Editar: Aqui é algo para verificar - é possível que o Course parâmetro não é exatamente o mesmo tipo em uma das duas declarações? Em outras palavras, é possível que algo como isso aconteceu:

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

Isso significa erro que o método parcial seu estão implementando não tenha sido definidos na classe LawEnforcementDataContext.

Estes métodos devem ser definidas automaticamente quando você adicionar tabelas em seu DataContext, olhar na fonte gerado (provavelmente LawEnforcement.designer.cs) para uma região dentro da classe LawEnforcementDataContext #region rotulado será definido Método de extensibilidade Definições todos os métodos parciais aqui. Espero que os métodos vai estar ausente, tente remover e re-adicionando tabela de Curso em seu modelo de Linq para gerá-los.

Para esclarecer, é a classe que é parcial, e não os métodos dentro dele -. A classe DataContext gerado pelo L2S é uma classe parcial, mas não contém quaisquer métodos parciais ** correção abaixo **

Para esclarecimentos sobre a diferença de que define e declarações de métodos parciais, Isto pode ajudar .

Editar

Bem, eu nunca - eu não vi / utilizados métodos "#region Método extensibilidade Definições" antes ... você aprender alguma coisa todos os dias! De qualquer forma, o artigo I ligada a uma discussão útil sobre os métodos parciais em geral, separar L2S.

Ronnie, Eu só tive esse mesmo problema. Ressalva:. Seja cauteloso quando você tem várias classes em um arquivo entidade

Verificar onde a classe parcial implantada:? Você acidentalmente colocar a definição dentro dos colchetes contexto de dados como eu fiz

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top