簡體   English   中英

EF5 Code First和RIA Services Silverlight“對象引用未設置為對象的實例”錯誤構建客戶端

[英]EF5 Code First and RIA Services Silverlight “Object reference not set to an instance of an object” error building client

我正在使用Code First為使用RIA服務的silverlight中的實體框架5建立一個新項目。 由於我遇到的一些問題,我已經創建了一個測試項目,並將在下面發布代碼。

也就是說,每當我嘗試構建應該生成客戶端代理類的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
}

您的外鍵字段未映射,因此代理代碼生成器(在編譯期間調用以構建代理的代碼段)無法解釋它們。
你應該把你的DbContext

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

另外,我建議你改變你的
public virtual List<Character> Characters { get; set; }

public virtual ICollection<Character> Characters { get; set; } public virtual ICollection<Character> Characters { get; set; } ,因為我不知道,如果代理生成器(和EF太)將正確映射該列表。
編輯:
我認為EF Metadataprovider沒有在描述中提供正確的屬性。
KeyAttribute放在Character.CharacterId和Person.PersonID上,同時在Character.Person上添加這一行

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

而這一個超過Person.Characters

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

編輯:
在與KitKat聊天后,我們終於找到了問題所在。 在代理生成期間,對Assembly.GetExportedTypes的調用崩潰了,它需要EF 4.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代碼和WCF Ria服務

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM