6

RIA サービスを使用して、Silverlight でエンティティ フレームワーク 5 の Code First を使用して、新しいプロジェクトのセットアップに取り組んでいます。問題が発生したため、テスト プロジェクトを作成し、以下のコードを投稿します。

つまり、クライアント プロキシ クラスを生成する Silverlight クライアント プロジェクトをビルドしようとすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。

明確にするために、このエラーはアプリケーションの実行中またはデバッグ中ではなく、ビルド中に発生します。

これは、Code First クラスでナビゲーション プロパティ/外部キーが定義されている場合にのみ発生することを特定しました。

今夜はどんな助けでも大歓迎です。

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

1 に答える 1

6

外部キーフィールドはマップされていないため、プロキシコードジェネレーター(コンパイル中にプロキシを構築するために呼び出されるコード)で解釈することはできません。
DbContextのようなものを入れる必要があります

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

また、プロキシジェネレータ(およびEFも)がそのリストを正しくマップするかどうかわからないため、に変更する
public virtual List<Character> Characters { get; set; }
ことをお勧めします。編集: EFメタデータプロバイダーが説明に正しい属性を提供していないと思います。Character.CharacterIdとPerson.PersonID の上に置き、また、この行をCharacter.Personの上に追加します
public virtual ICollection<Character> Characters { get; set; }


KeyAttribute

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

そしてこれはPerson.Charactersの上にあります

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

編集:
KitKatとチャットした後、私たちはついに問題を発見しました。プロキシの生成中に、Assembly.GetExportedTypesの呼び出しがクラッシュし、EF4.1が必要であるとの苦情がありました。簡単なパッティング

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

関連する設定でトリックを行いました

注:このリンクでは、EF5コードを最初に処理する方法とWCFRiaServicesをより適切に説明している私のブログ投稿を参照してください。

于 2012-10-25T06:58:09.013 に答える