我正在使用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中的东西放进去
你应该把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)]
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>
在相关配置中做了技巧
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。