Kit*_*Kat 6 silverlight entity-framework wcf-ria-services ef-code-first silverlight-5.0
我正在使用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; },因为我不确定代理生成器(和EF也是如此)是否会正确映射该列表.
编辑:
 
我认为EF Metadataprovider没有在描述中提供正确的属性.
放一个KeyAttributeCharacter.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服务
| 归档时间: | 
 | 
| 查看次数: | 2331 次 | 
| 最近记录: |