6

Sto lavorando all'impostazione di un nuovo progetto utilizzando Code First per il framework 5 entità in silverlight utilizzando i servizi RIA. Ho creato un progetto di test a causa di alcuni problemi che ho riscontrato e pubblicheremo il codice qui sotto.Codice EF5 Primo e servizi RIA Silverlight "Riferimento oggetto non impostato su un'istanza di un oggetto" errore creazione client

Vale a dire, ottengo un errore 'Riferimento oggetto non impostato su un'istanza di un oggetto' ogni volta che tento di creare il progetto client Silverlight che dovrebbe generare le classi proxy client.

Giusto per essere chiari, questo errore non si verifica durante l'esecuzione o il debug dell'applicazione, ma durante la creazione.

Ho isolato che ciò accada solo se ho delle proprietà di navigazione/chiavi esterne definite sul mio codice Prime classi.

Qualsiasi aiuto stasera sarebbe molto apprezzato.

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

Quale progetto sta causando il problema, il progetto silverlight o il progetto EF? Potete anche verificare che non vi siano file mancanti e SL build senza il vostro link Servizi RIA WCF –

+0

@Rikkos Era il progetto SL, ed è stato costruito correttamente se rimuovo tutte le relazioni dalla mia entità. Vedere la soluzione parziale di seguito. Era una combinazione di problemi nell'usare il TextTemplate nel toolkit unito ad altre soluzioni che avevo già provato. – KitKat

risposta

6

I suoi campi chiave stranieri non vengono mappate, quindi non possono essere interpretati dal generatore di codice proxy (il pezzo di codice chiamato per costruire il proxy durante la compilazione).
Si dovrebbe mettere in voi DbContext qualcosa di simile

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

anche, ti suggerisco di cambiare la
public virtual List<Character> Characters { get; set; }
a
public virtual ICollection<Character> Characters { get; set; }, perché io non sono sicuro se il generatore di proxy (e EF troppo) mapperà correttamente tale elenco.
MODIFICA:
Sto pensando che EF Metadataprovider non stia fornendo l'attributo corretto nella descrizione.
mettere un KeyAttribute sul Character.CharacterId e Person.PersonID, anche, aggiungere questa riga sopra Character.Person

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

e questo uno sopra Person.Characters

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

EDIT:
Dopo la chat con KitKat abbiamo finalmente trovato il problema. Durante la generazione del proxy, una chiamata a Assembly.GetExportedTypes ha provocato un arresto anomalo durante il richiamo di EF 4.1. semplice mettere

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

nella relativa configurazione ha fatto il trucchi

Nota: a post del blog questo link di ther dalla mia che meglio spiega come trattare con il codice EF5 prima e WCF Ria Servizi

+0

Grazie mille per la risposta, tuttavia ottengo lo stesso risultato. Ho seguito questi passaggi nel mio progetto attuale e non li ho ripresi in prova fino a quando non ho letto il tuo post. La mia comprensione è stata che EF ha raccolto le convenzioni sui nomi. Ma dopo aver definito esplicitamente la relazione, ottengo ancora lo stesso errore. Qualche idea? – KitKat

+0

@KitKat Prego. mmm Penso piuttosto che il tuo metadataprovider EF5 non stia mettendo il necessario AssociationAttribute. Ho intenzione di modificare la mia risposta – mCasamento

+0

Ho tentato anche questo. Ancora un no-go. Esaminando gli assembly Microsoft nel browser degli oggetti, non penso proprio all'ultima versione se i Servizi RIA supportano più il codice. Ho dovuto scaricare un pacchetto Nu Get di terze parti per arrivare così lontano. WCFRIA.EntityFramework – KitKat

Problemi correlati