EF5 Code First和RIA Services Silverlight“对象引用未设置为对象的实例”错误构建客户端

前端之家收集整理的这篇文章主要介绍了EF5 Code First和RIA Services Silverlight“对象引用未设置为对象的实例”错误构建客户端前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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,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);
 }

另外,我建议你改变你的公共虚拟列表< Character>人物{得到;组; }
公共虚拟ICollection< Character>人物{得到;组;因为我不确定代理生成器(以及EF)是否会正确映射该列表.
编辑:
我认为EF Metadataprovider没有在描述中提供正确的属性.
将KeyAttribute放在Character.CharacterId和Person.PersonID上,同时在Character.Person上添加这一行

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

而这一个超过Person.Characters

Association("Character_Person","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>

在相关配置中做了技巧

注意:在我的link ther博客文章中,更好地解释了如何首先处理EF5代码和WCF Ria服务

猜你在找的Silverlight相关文章