LINQ ~ SQL- 부분 클래스 및 메소드로 데이터 컨텍스트를 확장 할 때 오류를 컴파일합니다.

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

문제

DataContext.designer.cs 파일의 Extensibility Method 정의를 사용하여 일부 유효성 검사를 수행하려고합니다.

그래서 새 파일을 만들고이 코드를 추가했습니다.

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

이러한 오류로 인해 컴파일 할 수 없습니다.

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

내가 뭘 잘못하고 있는지 보지 못합니다. 나는 전에 이것을 해냈다. 또한 위의 코드를 추가 한 후 LINQ에서 SQL에서 생성 된 클래스를 참조하는 코드에서 내 엔티티 유형이 더 이상 존재하지 않는다고 불평합니다. 마치 부분 클래스 LawenForcementDataconText가 생성 된 코드를 완전히 인수하는 것처럼 보입니다.

편집하다

다음은 생성 된 코드의 부분 선언의 다른 절반입니다.

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

    // the methods
    partial void InsertCourse(Course instance);
    partial void UpdateCourse(Course instance);
도움이 되었습니까?

해결책

두 부분 클래스는 다른 네임 스페이스에 정의되므로 컴파일러는 '공유'하지 않습니다.

이를 위해 DBML 디자이너의 속성 아래에 설정이 있습니다. 아마도 재설정 될까요?

다른 팁

LINQ에서 필드를 검증하려면 삽입 및 업데이트 방법이 아닌 OnValidate 메소드를 구현해야합니다.

예를 들어:

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

제거하십시오 partial 메소드의 키워드 - 생성 된 클래스에는 부분적 방법이 없습니다.

편집하다: 부분 방법은 다음과 같이 정의 될 때만 작동합니다.

partial class Foo
{
    partial void foo();
}

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

선언 중 하나는 추상 방법 또는 인터페이스 방법 선언처럼 작성해야합니다. 컴파일러가 구현에서 하나의 부분 메소드를 찾고 다른 곳에서 일치하는 부분 메소드 선언을 찾을 수없는 경우이 오류가 발생합니다.

편집하다: 확인해야 할 것이 있습니다. 매개 변수가 가능합니까? Course 두 선언 중 하나에서 똑같은 유형이 아닌가? 다시 말해, 이와 같은 일이 일어 났을 가능성이 있습니다.

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

이 오류는 귀하가 구현중인 부분 메소드가 LawEnforcementDataconText 클래스에서 정의되지 않았 음을 의미합니다.

이 메소드는 Datacontext에 테이블을 추가 할 때 자동으로 정의되어야합니다. #REGENCEMENTIONDATACONTEXT 클래스 내부의 영역에 대한 생성 된 소스 (아마도 lawEnforcement.Designer.cs)를 살펴보십시오. 메소드가 누락 될 것으로 기대합니다. LINQ 모델의 코스 테이블을 제거하고 다시 구분하여 생성 할 것으로 예상됩니다.

명확히하기 위해, 그것은 그 안의 방법이 아닌 부분적인 클래스입니다. L2S에 의해 생성 된 데이터 컨텍스트 클래스는 부분 클래스이지만 부분적 방법 ** 아래의 부분적 방법 **는 포함하지 않습니다.

차이에 대한 설명을 위해 정의 그리고 구현 부분 방법 선언, 이것은 도움이 될 수 있습니다.

편집하다

글쎄, 나는 결코 - 나는 전에 "#region Extensibility Method 정의"방법을 보지 못했거나 사용하지 않았다 ... 당신은 매일 무언가를 배웁니다! 어쨌든, 내가 링크 한 기사는 일반적으로 L2와 분리 된 부분 방법에 대한 유용한 토론입니다.

로니, 난 방금이 같은 문제에 부딪쳤다. 경고 : 하나의 엔티티 파일에 여러 클래스가있을 때 조심하십시오.

부분 클래스가 위치한 위치 확인 : 실수로 내가 한 것처럼 데이터 컨텍스트 브래킷 내부에 정의를 넣었습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top