6

Pracuję nad utworzeniem nowego projektu przy użyciu Code First dla struktury encji 5 w silverlight przy użyciu usług RIA. Stworzyłem projekt testowy z powodu napotkanych problemów i opublikuję poniższy kod.Kod EF5 Pierwszy i usługi RIA Silverlight "Obiekt odwołanie od obiektu nie jest ustawiony na wystąpienie obiektu" błąd budowanie klienta

Mianowicie, podczas próby zbudowania projektu klienta silverlight, który powinien generować klasy proxy klienta, otrzymuję komunikat o błędzie "Obiekt nie jest powiązany z wystąpieniem obiektu".

Dla jasności ten błąd nie działa podczas uruchamiania lub debugowania aplikacji, ale podczas jej budowania.

Wyizolowałem, że dzieje się tak tylko wtedy, gdy mam jakieś właściwości nawigacyjne/klucze obce zdefiniowane w moich Kodach Pierwszych klas.

Każda pomoc dziś wieczorem byłaby bardzo ceniona.

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

Jaki projekt powoduje problemy, projekt Silverlight lub projekt de EF? Czy możesz również sprawdzić, czy nie brakuje ci żadnych plików i czy SL buduje bez twojego WCF RIA Services link –

+0

@Rikkos To był projekt SL, i to dobrze, jeśli usunę wszystkie relacje z mojej jednostki. Zobacz rozwiązanie częściowe poniżej. Było to połączenie problemów związanych z używaniem TextTemplate w zestawie narzędzi połączonym z innymi rozwiązaniami, które już wypróbowałem. – KitKat

Odpowiedz

6

polach Klucz obcy nie są odwzorowane, a tym samym nie mogą być interpretowane przez generator kodu proxy (kawałek kodu nazywa zbudować proxy podczas kompilacji).
Należy umieścić w was DbContext coś jak

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

również, proponuję zmienić swoje
public virtual List<Character> Characters { get; set; }
do
public virtual ICollection<Character> Characters { get; set; }, ponieważ nie jestem pewien, czy generator proxy (EF i zbyt) poprawnie zamapuje tę listę.
EDYCJA:
Myślę, że EF Metadataprovider nie dostarcza poprawnego atrybutu w opisie.
Umieść KeyAttribute nad Character.CharacterId i Person.PersonID również dodać tę linię na Character.Person

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

i ten nad Person.Characters

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

EDIT:
Po rozmowie z KitKat w końcu znaleźliśmy problem. Podczas generowania proxy wywołanie Assembly.GetExportedTypes spowodowało awarię aplikacji wymagającej EF 4.1. Proste oddanie

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

w odpowiednim config robił sztuczki

Uwaga Obecnie link Ther na blogu z kopalni, które lepiej wyjaśnia, jak radzić sobie z Kodeksem EF5 pierwszy i WCF Ria Services

+0

Bardzo dziękuję za odpowiedź, ale nadal otrzymuję ten sam wynik. Przeszedłem przez te kroki w moim rzeczywistym projekcie i nie próbowałem ich ponownie przetestować, dopóki nie przeczytam twojego postu. Rozumiem, że EF wybrał konwencje nazewnictwa. Ale po wyraźnym zdefiniowaniu relacji wciąż otrzymuję ten sam błąd. Jakieś pomysły? – KitKat

+0

@KitKat Nie ma za co. mmm Raczej myślę, że twój metadataprovider EF5 nie umieszcza potrzebnej Asocjacji. Zamierzam edytować moją odpowiedź: – mCasamento

+0

Próbowałem tego również. Wciąż nie ma wyjścia. Analizowanie złożeń Microsoftu w przeglądarce obiektów, po prostu nie sądzę najnowszej wersji, jeśli usługi RIA już wcześniej obsługują kod. Musiałem pobrać trzecią paczkę Nu Get, aby dostać się tak daleko. WCFRIA.EntityFramework – KitKat

Powiązane problemy