LINQ ~ SQL- 부분 클래스 및 메소드로 데이터 컨텍스트를 확장 할 때 오류를 컴파일합니다.
-
03-07-2019 - |
문제
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와 분리 된 부분 방법에 대한 유용한 토론입니다.
로니, 난 방금이 같은 문제에 부딪쳤다. 경고 : 하나의 엔티티 파일에 여러 클래스가있을 때 조심하십시오.
부분 클래스가 위치한 위치 확인 : 실수로 내가 한 것처럼 데이터 컨텍스트 브래킷 내부에 정의를 넣었습니까?