6

RIAサービスを使用してSilverlightでエンティティフレームワーク5のコードファーストを使用して新しいプロジェクトを設定しています。私は遭遇したいくつかの問題のためにテストプロジェクトを作成し、以下のコードを投稿します。EF5コードファーストとRIAサービスSilverlight「オブジェクトのインスタンスがオブジェクトのインスタンスに設定されていません」エラービルドクライアント

つまり、クライアントプロキシクラスを生成する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

問題を引き起こしているプロジェクトはどれですか、Silverlightプロジェクトか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比べてこの1

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

EDIT:
KitKatとチャットしたところ、最終的に問題が見つかりました。プロキシの生成中に、Assembly.GetExportedTypesへの呼び出しがEF 4.1が必要であると不満を表明しました。より良いが、最初EF5コードとWCF RIAサービス

に対処する方法を説明していること鉱山からこの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

私もこれを試みました。まだ行きません。オブジェクトブラウザでMicrosoftのアセンブリを調べると、RIA Servicesがコードを最初にサポートしていれば、最新のバージョンとは思えません。私はサードパーティのNu Getパッケージをダウンロードしなければならなかった。 WCFRIA.EntityFramework – KitKat

関連する問題