I am working on setting up a new project using Code First for entity framework 5 in silverlight using RIA services. I have created a test project due to some issues I have encountered and will post the code below.
Namely, I get an 'Object reference not set to an instance of an object' error anytime I attempt to build the silverlight client project which should generate the client proxy classes.
Just to be clear, this error is not while running or debugging the application, but when building it.
I have isolated that this only happens if I have any navigation properties/Foreign Keys defined on my Code First classes.
Any help tonight would be greatly appreciated.
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
}