문제

내 데이터 모델에서 테이블 당 유형 상속을 구현했습니다 (기본적으로 BaseEntity 내 항목에 대한 모든 기본 정보를 입력하고 Employer 에서 상속하는 입력 BaseEntity 안건). 모든 것이 올바르게 설정된 것으로 보이며 엔티티 (ADO.NET 데이터 서비스를 통해 또는 LINQ를 통해 엔티티를 통해)를 사용할 때 Employer 유형과 물건은 괜찮은 것 같습니다. 새로운 것을 만들 때 문제가 시작됩니다 Employer 엔티티와 저장을 시도합니다.

컨텍스트에서 .AddToEmployer 항목 (만 및 AddObject 또는 AddToBaseEntity).

내가 사용하는 경우 AddObject("Employer", NewEmployer) 나는 다음과 같은 메시지를 얻고 오류 메시지를 받는다.

EntitySet Name 'DataEnties.employer'를 찾을 수 없습니다.

내가 사용하는 경우 AddToBaseEntity(NewEmployer) 오류 메시지가 나타납니다.

종속 작업에 대한 유효한 순서를 결정할 수 없습니다. 외국의 주요 제약 조건, 모델 요구 사항 또는 스토어 생성 값으로 인해 종속성이 존재할 수 있습니다.

상속을 설정하는 단계를 놓쳤습니까? 상속 된 객체를 저장하는 특정 방법이 있습니까? 내가 뭘 잘못하고 있죠? 기본적인 문제는 내가 AddToEmployer, 노출을 얻기 위해 무엇을해야합니까? 클라이언트 측에서 고용주 유형을 볼 수 있고 다음과 같은 작업을 수행 할 수 있기 때문에 옵션이 아니라는 것은 이상하게 보입니다.

var NewEmployer = new Employer() - 고용주 유형이 잘 볼 수 있다고 제안하는 것 같습니다.

도움이 되었습니까?

해결책 3

나는 몇 가지를 바꾸고 이것을 작동시킬 수있었습니다. 기본 문제가 무엇인지 특별히 확신하지 못했지만 참조를 위해 한 일을 게시하고 싶었습니다.

테이블을 재건 : ID/키 열과 단일 데이터 열로 시작하여 테이블을 재건했습니다.

추가 자동 증분 필드 제거 : Baseentity와 고용주에 대한 자동 증가 ID가있었습니다. 고용주의 자동 증가 ID를 제거하고 고용주가 있었다. BaseEntityId 열과 외국 키를 BaseEntity.baseentityId로 되돌려 놓았다. (이것은 범인 인 것 같지만, 이것이 허용 된 인상을 받았습니다)

불행히도 이것은 엔티티 프레임 워크의 클래스를 침범 한 문제로 이어지는 문제가 발생하여 내비게이션 속성 (모든 탐색 속성이 기본 엔티티에 있어야 함)을 가질 수 없으므로 상속은 우리의 요구에 대해 사용할 수없는 것으로 판명 될 것입니다.

다른 팁

제 이름은 Phani이고 Ado.net Data Services 팀에서 일하고 있습니다.

그만큼 ResolveName 그리고 ResolveType 메소드는 클라이언트가 서버에 전송 된 페이로드에서 작성된 유형 정보를 사용자 정의하고 서버의 응답 페이로드가 구체화되는 방법을 사용자 정의하는 데 도움이됩니다.

고객의 유형을 해결하는 데 도움이되며 많은 시나리오에서 유용합니다. 몇 가지 예는 다음과 같습니다.

  1. 엔티티의 유형 계층 구조는 서버에 비해 클라이언트가 다릅니다.
  2. 서비스에 노출 된 엔티티 유형은 상속에 참여하며 클라이언트에서 파생 된 유형으로 작업하려고합니다.

ResolveName 서버에 요청할 때 와이어에 넣은 엔티티의 이름을 변경하는 데 사용됩니다.

이 데이터 모델을 고려하십시오 : 서버에서

public class Employee {
    public int EmployeeID {get;set;}
    public string EmployeeName {get;set;}
}

public class Manager:Employee {
    public List<int> employeesWhoReportToMe {get;set;}
}

클라이언트를 사용하여 관리자 엔티티 유형의 인스턴스와 함께 작업 할 때 서버에 변경 사항을 제출하면 엔티티가 상속에 참여할 때 유형 정보가 페이로드에 존재할 것으로 예상됩니다.

context.AddObject("Employees",ManagerInstance ); <-- add manager instance to the employees set.
context.SaveChanges();

그러나 클라이언트 가이 페이로드를 연속화 할 때 서버에서 예상되는 유형 이름으로 "직원"을 넣습니다. 따라서 클라이언트에 이름 Resolver를 제공해야합니다.

context.ResolveName = delegate(Type entityType){
    //do what you have to do to resolve the type to the right type of the entity on the server
    return entityType.FullName;
}

유형 리졸버는 같은 방식으로 사용됩니다.

context.ResolveType = delegate(string entitySetName){
    //do what you have to do to convert the entitysetName to a type that the client understands
    return Type.GetType(entitySetName);
}

글쎄, 당신은 엔터티 세트 PR 만 얻습니다. 기본 클래스 so.addtobaseentity는 그러한 솔루션입니다.

그러나 모델에 원형 의존성이있는 것처럼 들리므로 엔티티 프레임 워크가 저장 할 순서를 알 수 없습니다.

파생 된 엔티티의베이스 엔티티에 대한 외국 키가 있는지 확인하고 모델을 업데이트하십시오.

엔티티 유형과 마찬가지로 엔티티 세트로 정의 된 고용주가 없습니다. 그것이 컨텍스트 객체에서 Addtoentity를 놓치고있는 방식입니다. 하나의 클래스 계층 구조에 대해 항상 하나의 엔티티가 설정되어 있으며,이 경우베이스 클래스 엔티티 세트입니다.

엔티티 세트 '고용주'를 받으려면 EDMX 파일을 수동으로 편집하고 새 엔티티 세트 '고용주'를 추가 한 다음 해당 엔티티 세트에 속한 엔티티 유형 '고용주'를 설정하려고 시도 할 수 있습니다. 어렵지 않아야합니다. 나는 많은 시간을했습니다.

더 일반적인 솔루션이 있는지 확실하지 않습니다.

2 년 후, 검색 트래픽과 관련된 관심을 유지하기 위해 여기에 데이터베이스를 스테이징 데이터로 빠르게 채우는 데 사용하는 편의 클래스 에서이 작업을 빠르게 해결하는 방법이 있습니다.

이전 버전에 대해서는 확실하지 않지만 엔티티 프레임 워크 4를 사용하면 객체를 컨텍스트에 기본 객체로 덤프 한 다음 프레임 워크가 서버 측 참조를 파악할 수 있습니다. 따라서 AddToInHeritedObjects () (어쨌든 더 이상 사용되지 않음)가 아니라 ObjectSet <> add () 메소드를 사용하지 않습니다.

다음은 도우미 수업 예입니다.

public ContextHelper
{
        …
        _context = ModelEntities();

        public T Create<T>() where T : class
        {
            // Create a new context
            _context = new ModelEntities();

            // Create the object using the context (can create outside of context too, FYI)
            T obj = _context.CreateObject<T>();

            // Somewhat kludgy workaround for determining if the object is
            // inherited from the base object or not, and adding it to the context's
            // object list appropriately.    
            if (obj is BaseObject)
            {
                _context.AddObject("BaseObjects", obj);
            }
            else
            {
                ObjectSet<T> set = _context.CreateObjectSet<T>();
                set.AddObject(obj);
            }

            return obj;
        }
        …
}

따라서 다음이 있다고 가정합니다.

class ObjectOne : BaseObject {}
class ObjectTwo {}

상황에 쉽게 엔티티를 추가 할 수 있습니다.

ContextHelper ch = ContextHelper()
ObjectOne inherited = ch.Create<ObjectOne>();
ObjectTwo toplevel = ch.Create<ObjectTwo>();
…

물론 ContexThelper는 _context.sevechanges ()를 호출하는 공개 저장 () 메소드가 있어야하거나 객체 변경을 데이터 스토어까지 푸시하는 다른 방법이 있어야한다는 것을 기억합니다.

이것은 상속에 대한 주어진 질문에 대한 직접적인 응답이 아닐 수도 있지만, 사람들에게 세부 사항에 답할 수있는 출발점을 제공하기를 바랍니다.

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