나는 Round
컬렉션이 포함 된 Tournament
클래스를 포함하는 ASP.NET MVC4 토너먼트 관리 시스템을 만들고 있습니다. 저는 EF Code First에 익숙하지 않지만 EF가 가상으로 선언 된 한 인스턴스화시 관찰 된 프록시 클래스가있는 supposed to initialize 컬렉션 객체라는 것을 이해했습니다. 아래 코드에서 ASP.NET 컨트롤러의 요소를 추가하려고 할 때 null 인 이유는 무엇입니까? 엔티티를 저장 한 후 데이터 컨텍스트를 다시 초기화 Entity Framework에서 내 탐색 모음을 초기화하지 않는 이유는 무엇입니까?
public class Tournament
{
public int Id { get; set; }
[Required]
public String Name { get; set; }
public virtual ICollection<Contestant> Contestants { get; set; }
public virtual ICollection<Round> Rounds { get; set; }
public void InitializeDefaults()
{
var round = new Round("Round 1");
Rounds.Add(round); // Generates NullReferenceException when called from controller
}
}
public class Round
{
public long Id { get; set; }
public int MaxContestants { get; set; }
public String Title { get; set; }
public Round() { }
public Round(string title) : this()
{
Title = title;
}
}
public class MainController {
// (...)
[HttpPost]
public ActionResult CreateTournament(Tournament tournament)
{
var db = new DataContext();
var dbTournament = db.Tournaments.Create();
dbTournament.Name = tournament.Name;
db.Tournaments.Add(dbTournament);
dbTournament.InitializeDefaults();
db.SaveChanges();
return RedirectToRoute(new { action = "Main", tournamentId = dbTournament.Id });
}
}
public class DataContext : DbContext
{
public IDbSet<Tournament> Tournaments { get; set; }
public IDbSet<Judge> Judges { get; set; }
public IDbSet<Contestant> Contestants { get; set; }
}
갱신
, 내 문제를 해결합니다. 그러나 올바른 방법이 아닙니다. 원래의 질문입니다.CreateTournament
변경된
는
[HttpPost]
public ActionResult CreateTournament(Tournament tournament)
{
var db = App.ServiceLocator.GetDataBase();
db.Tournaments.Add(tournament);
db.SaveChanges();
db.Dispose();
// Reinitializing the datacontext
db = App.ServiceLocator.GetDataBase();
var dbTournament = db.GetTournament(tournament.Id);
dbTournament.InitializeDefaults();
db.SaveChanges();
return RedirectToRoute(new { action = "Main", tournamentId = dbTournament.Id });
}
은을 가지고 : 제 생각에는 가장 간단하고 저렴한 솔루션은
InitializeDefaults
방법의 기본 생성자의 표준 컬렉션을 초기화 ...... 또는 적어도 가드 중 하나입니다 보세요 : http://stackoverflow.com/questions/4069563/why-is-my-entity-framework-code-first-proxy-collection-null-and-why-cant-i-set – Marthijn