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
}
Run Code Online (Sandbox Code Playgroud)
您的外键字段未映射,因此代理代码生成器(在编译期间调用以构建代理的代码段)无法解释它们.
你应该把你的DbContext什么样
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Character>()
.HasRequired(x=> x.Person)
.WithMany(x=> x.Characters)
.HasForeignKey(x=> x.PersonId);
}
Run Code Online (Sandbox Code Playgroud)
另外,我建议你改变你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)]
Run Code Online (Sandbox Code Playgroud)
而这一个超过Person.Characters
Association("Character_Person", "PersonId", "PersonId")]<br>
Run Code Online (Sandbox Code Playgroud)
编辑:
与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>
Run Code Online (Sandbox Code Playgroud)
在相关配置中做了技巧
注意:在此链接中我的博客文章中更好地解释了如何首先处理EF5代码和WCF Ria服务