[英]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.