6

RIA 서비스를 사용하여 Silverlight에서 엔터티 프레임 워크 5의 코드 우선을 사용하여 새 프로젝트를 설정하고 있습니다. 내가 만난 몇 가지 문제로 인해 테스트 프로젝트를 만들었으며 아래 코드를 게시 할 것입니다.EF5 코드 첫 번째 및 RIA 서비스 Silverlight "개체 참조가 개체 인스턴스로 설정되지 않았습니다."오류 건물 클라이언트

즉, 클라이언트 프록시 클래스를 생성해야하는 실버 라이트 클라이언트 프로젝트를 빌드 할 때마다 '객체 참조가 객체 인스턴스로 설정되지 않았습니다'라는 오류가 발생합니다.

이 오류는 응용 프로그램을 실행하거나 디버깅하는 동안이 아니라 빌드 할 때 분명합니다.

내 탐색 속성/내 코드 첫 번째 클래스에 정의 된 외래 키가있는 경우에만 발생합니다.

오늘 밤 도움을 주시면 감사하겠습니다. 귀하의 외래 키 필드가 매핑되지 않은

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime? BirthDate { get; set; } 

    public virtual List<Character> Characters { get; set; } 
} 

public class Character 
{ 
    public int CharacterId { get; set; } 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
    public string CharacterName { get; set; } 
} 

public class CharacterDbContext : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 
    public DbSet<Character> Characters { get; set; } 

    public CharacterDbContext() 
    { 
     if (HttpContext.Current == null) 
     { 
      Database.SetInitializer<CharacterDbContext>(null); 
     } 
    } 
} 

[EnableClientAccess] 
public class CharacterDbService : DbDomainService<CharacterDbContext> 
{ 
    #region Basic Methods for Person with the context property of Persons 

    [Query] 
    public IQueryable<Person> GetPersons() 
    { 
     return DbContext.Persons; 
    } 

    [Insert] 
    public void InsertPerson(Person entity) 
    { 
     DbEntityEntry<Person> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Detached) 
     { 
      entityEntry.State = EntityState.Added; 
     } 
     else 
     { 
      DbContext.Persons.Add(entity); 
     } 
    } 

    [Update] 
    public void UpdatePerson(Person entity) 
    { 
     DbContext.Persons.AttachAsModified(entity, ChangeSet.GetOriginal(entity), DbContext); 
    } 

    [Delete] 
    public void DeletePerson(Person entity) 
    { 
     DbEntityEntry<Person> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Deleted) 
     { 
      entityEntry.State = EntityState.Deleted; 
     } 
     else 
     { 
      DbContext.Persons.Attach(entity); 
      DbContext.Persons.Remove(entity); 
     } 
    } 

    #endregion 

    #region Basic Methods for Character with the context property of Characters 

    [Query] 
    public IQueryable<Character> GetCharacters() 
    { 
     return DbContext.Characters; 
    } 

    [Insert] 
    public void InsertCharacter(Character entity) 
    { 
     DbEntityEntry<Character> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Detached) 
     { 
      entityEntry.State = EntityState.Added; 
     } 
     else 
     { 
      DbContext.Characters.Add(entity); 
     } 
    } 

    [Update] 
    public void UpdateCharacter(Character entity) 
    { 
     DbContext.Characters.AttachAsModified(entity, ChangeSet.GetOriginal(entity), DbContext); 
    } 

    [Delete] 
    public void DeleteCharacter(Character entity) 
    { 
     DbEntityEntry<Character> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Deleted) 
     { 
      entityEntry.State = EntityState.Deleted; 
     } 
     else 
     { 
      DbContext.Characters.Attach(entity); 
      DbContext.Characters.Remove(entity); 
     } 
    } 

    #endregion 
} 
+0

어떤 프로젝트가 문제를 일으키고 있습니까, 실버 라이트 프로젝트 또는 de EF 프로젝트입니까? 또한 파일을 놓치지 않았는지 확인하고 WCF RIA Services 링크없이 SL을 빌드 할 수 있습니까? –

+0

@Rikkos SL 프로젝트 였고 모든 엔티티 양식을 제거하면 정상적으로 빌드되었습니다. 아래 부분 솔루션을 참조하십시오. 이미 시도한 다른 솔루션과 병합 된 툴킷에서 TextTemplate을 사용하는 것이 문제의 조합이었습니다. – KitKat

답변

6

은, 따라서 그들은 프록시 코드 생성기 (컴파일하는 동안 프록시를 구축하기 위해 호출 코드의 조각)에 의해 해석 할 수 없습니다. 나는 확실하지 않다 때문에 당신은 당신에 넣어해야
이도

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<Character>() 
      .HasRequired(x=> x.Person) 
      .WithMany(x=> x.Characters) 
      .HasForeignKey(x=> x.PersonId); 
} 

같은 것을 을 DbContext, 내가, 당신이 당신의
public virtual List<Character> Characters { get; set; }

public virtual ICollection<Character> Characters { get; set; }로 변경하는 것이 좋습니다 경우 프록시 생성기 (그리고 EF도)는 해당 목록을 올바르게 매핑합니다.
편집 :
EF Metadataprovider가 설명에 올바른 속성을 제공하지 않는다고 생각합니다.
는 또한 Character.CharacterId 및 Person.PersonID 통해 KeyAttribute을 넣어 Character.Person

[Association("Character_Person", "PersonId", "PersonId", IsForeignKey = true)] 

이상이 줄을 추가하고 Person.Characters 이상이 하나

Association("Character_Person", "PersonId", "PersonId")]<br> 

편집 :
KitKat과 채팅 한 후 마침내 문제가 발견되었습니다. 프록시 생성 중에 Assembly.GetExportedTypes에 대한 호출이 EF 4.1이 필요하다고 불평하면서 충돌했습니다. 더 나은 먼저 EF5 코드 및 WCF 리아 서비스

를 처리하는 방법에 대해 설명합니다 것을 내에서이 link THER의 블로그 게시물에서 : 관련 설정에

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

를 넣어 간단한 는 트릭

참고했다

+0

답장을 보내 주셔서 대단히 감사합니다. 그러나 여전히 동일한 결과를 얻습니다. 나는 실제 프로젝트에서 이러한 단계를 밟아 왔고 게시물을 읽을 때까지 테스트를 다시 시도하지 않았습니다. 내 이해는 EF가 명명 규칙을 채택한 것입니다. 그러나 관계를 명시 적으로 정의한 후에도 여전히 동일한 오류가 발생합니다. 어떤 아이디어? – KitKat

+0

@KitKat 환영합니다. 음, 오히려 EF5 메타 어댑터가 필요한 AssociationAttribute를 넣지 않고 있다고 생각합니다. 내 대답 – mCasamento

+0

편집하려고합니다 나는 이것도 시도했다. 아직도 안돼. RIA Services가 코드를 더 이상 지원하지 않으면 개체 브라우저에서 Microsoft 어셈블리를 검사하면 최신 버전이 아닌 것 같습니다. 나는 제 3 자 Nu Get 패키지를 다운로드해야만했다. WCFRIA.EntityFramework – KitKat