EF 4.1 Code First System Initialization Database.NullReferenceException Загрузка данных

Я использую EF 4.1 Code First, и у меня возникают проблемы с инициализацией моих данных так, как я думаю, я должен быть в состоянии. В моем коде ниже вы увидите, что у меня есть модель, которая начинается с клиента и содержит ряд связанных объектов. Я загружаю каждый тип объекта и устанавливаю его в родительский объект. После того, как мои данные загружены в мои объекты, я пытаюсь сохранить объект верхнего уровня Client в базе данных. Когда я делаю это, я получаю System.NullReferenceException.

EF не будет делать глубокую загрузку?

Нужно ли сохранять каждый набор объектов в базе данных, чтобы они связали их друг с другом и сохранили их в базе данных? Если мне нужно сделать это, мне кажется, что было бы очень сложно загрузить мои данные, когда их можно будет выполнить в одном запросе.

Любые советы или ответы будут оценены.

Ниже мой код, а ниже это мое исключение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace MyNameSpace
{
  class Program
  {
    static void Main(string[] args)
    {
        Database.SetInitializer(new TimeServiceContextInitializer());
        TimeServiceContext db = new TimeServiceContext();
        var clients = db.Clients.ToList();

        foreach (var client in clients)
        {
            Console.WriteLine("Client: {0}\r\nNumber of Sites: {1}\r\n", client.Name, client.Sites.Count);  
        }
    }
}

// Initialize Database
public class TimeServiceContextInitializer : DropCreateDatabaseIfModelChanges<TimeServiceContext>
{
    protected override void Seed(TimeServiceContext db)
    {
        List<Client> clients = new List<Client>();

        Client client = new Client();
        client.Name = "Achme Big Company";

        Site site = new Site();
        site.Name = "www.SampleSite.com";

        Project project = new Project();
        project.Name = "Schololarship Application Phase 1";
        project.Description = "Create an application that allows student to apply for scholarship in the www.SampleSite.com web site.";
        project.DateCreated = DateTime.Now.AddDays(-15);
        project.StartDate = DateTime.Now.AddDays(-5);
        project.DeadlineDate = DateTime.Now.AddDays(45);
        project.Status = Status.In_Progress;
        project.FixedFee = 40500.00m;
        project.SpecialNotes = "This project has a firm deadline due to the fact that marketing information is already set to go out to advertize applying for scholarships online through the web site";

        TimeEntry timeEntry = new TimeEntry();
        timeEntry.EmployeeName = "Brian Johns";
        timeEntry.TasksPerformed = "Started working on sceen mockups for the first page of the scholoarship application";
        timeEntry.TimeRecorded = DateTime.Now.AddDays(-4).AddHours(10);
        project.TimeEntries.Add(timeEntry); /// <---- --------------------------- GET System.NullReferenceException Exception Here -----------

        timeEntry = new TimeEntry();
        timeEntry.EmployeeName = "Brian Johns";
        timeEntry.TasksPerformed = "Completed first section of form fields and started on the second section for the first page of the scholoarship application";
        timeEntry.TimeRecorded = DateTime.Now.AddDays(-4).AddHours(11.5);
        project.TimeEntries.Add(timeEntry);

        timeEntry = new TimeEntry();
        timeEntry.EmployeeName = "Brian Johns";
        timeEntry.TasksPerformed = "Decided we needed to regroup fields so started modifying form layout to work better on the first page of the scholoarship application";
        timeEntry.TimeRecorded = DateTime.Now.AddDays(-4).AddHours(13.25);
        project.TimeEntries.Add(timeEntry);

        timeEntry = new TimeEntry();
        timeEntry.EmployeeName = "Brian Johns";
        timeEntry.TasksPerformed = "Completed first form of the scholarship application.  Started discussing the next form for step 2 of the scholarship application process";
        timeEntry.TimeRecorded = DateTime.Now.AddDays(-4).AddHours(14);
        project.TimeEntries.Add(timeEntry);

        site.Projects.Add(project);
        client.Sites.Add(site);

        db.Clients.Add(client);
        db.SaveChanges();

        base.Seed(db);
    }
}

// Context
public class TimeServiceContext : DbContext
{
    public DbSet<Client> Clients { get; set; }
    public DbSet<Site> Sites { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<TimeEntry> TimeEntries { get; set; }
}

// Model Starts Here
public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Site> Sites { get; set; }
    public DateTime DateCreated { get; set; }
}

public class Site
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Project> Projects { get; set; }
    public int ClientId { get; set; }
    public DateTime DateCreated { get; set; }
}

public enum Status { Not_Started, In_Progress, Completed };

public class Project
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime DeadlineDate { get; set; }
    public DateTime CompletionDate { get; set; }
    public decimal FixedFee { get; set; }
    public decimal HourlyRate { get; set; }
    public Status Status { get; set; }
    public string SpecialNotes { get; set; }

    public ICollection<TimeEntry> TimeEntries { get; set; }
    public int SiteId { get; set; }
    public DateTime DateCreated { get; set; }
}

public class TimeEntry
{
    public int id { get; set; }
    public string EmployeeName { get; set; }
    public string TasksPerformed { get; set; }
    public DateTime TimeRecorded { get; set; }
    public int InvoiceNumber { get; set; }
    public int ProjectId { get; set; }
}
}

Сведения о сущности: исключение System.NullReferenceException не было обработано кодом пользователя. Сообщение = ссылка на объект не установлена ​​для экземпляра объекта. Source=Console StackTrace: at MyNameSpace.TimeServiceContextInitializer.Seed(TimeServiceContext db) в C:\Users\Justin\Source Control\CoutoTimeService\Console\Program.cs: строка 51 в System.Data.Entity.DropCreateDatabaseIfModelChanges1.InitializeDatabase(TContext context) at System.Data.Entity.Database.<>c__DisplayClass21.b_0 (DbContext c) в System.Data.Entity.Internal.InternalContext.<> C_DisplayClass5.b_3 () в System.Data.Entity.Internal.InternalContext.PerformInitializationAction(действие Action) в System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() в System.Data.Entity.Internal.LazyInternalContext.b_4 (InternalContext c) в System.Data.Entity.Internal.RetryAction`1.PerformAction(вход TInput) InnerException:

1 ответ

Решение

Добавить конструктор в ваш класс проекта

Project(){
TimeEntries = new HashSet<TimeEntry>();
}

Вы также можете сделать свой код немного более привлекательным с помощью инициализаторов объектов, таких как:

Project project = new Project(){
    Name = "Schololarship Application Phase 1",
    Description = "Create an application that allows student to apply for scholarship in the www.SampleSite.com web site.",
    DateCreated = DateTime.Now.AddDays(-15),
    StartDate = DateTime.Now.AddDays(-5),
    DeadlineDate = DateTime.Now.AddDays(45),
    Status = Status.In_Progress,
    FixedFee = 40500.00m,
    SpecialNotes = "This project has a firm deadline due to the fact that marketing information is already set to go out to advertize applying for scholarships online through the web site"
};
Другие вопросы по тегам