EF 4.1 Code First System Initialization Database.NullReferenceException Загрузка данных - PullRequest
3 голосов
/ 08 июля 2011

Сначала я использую код EF 4.1, и у меня возникают проблемы с инициализацией моих данных так, как мне кажется. В приведенном ниже коде вы увидите, что у меня есть модель, которая начинается с клиента и содержит ряд связанных объектов. Я загружаю каждый тип объекта и устанавливаю его в родительский объект. После того, как мои данные загружены в мои объекты, я пытаюсь сохранить объект верхнего уровня 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; }
}
}

Подробности Esception: System.NullReferenceException не было обработано кодом пользователя Сообщение = ссылка на объект не установлена ​​для экземпляра объекта. Источник = Консоль Трассировки стека: в MyNameSpace.TimeServiceContextInitializer.Seed (TimeServiceContext db) в C: \ Users \ Джастин \ Source Control \ CoutoTimeService \ Console \ Program.cs: строка 51 в System.Data.Entity.DropCreateDatabaseIfModelChanges 1.InitializeDatabase(TContext context) at System.Data.Entity.Database.<>c__DisplayClass2 1.b_ 0 (DbContext c) в System.Data.Entity.Internal.InternalContext. <> c _DisplayClass5.b_ 3 () в System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Действие действия) в 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 Ответ

1 голос
/ 08 июля 2011

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

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"
};
...