实体框架:在包管理器控制台VS 2012中添加迁移时抛出Null Reference Exception

时间:2013-08-03 20:17:20

标签: c# asp.net-mvc entity-framework

我一直在我的mvc项目中使用实体框架代码首次迁移。但最近在修改我的模型类并添加新模型后,当我尝试在包管理器控制台中使用add-migration时,我不断收到此错误:'对象引用未设置为对象的实例'我正在使用{{1}当我尝试使用版本6但它看不到我的 DbContext 时,这是我的堆栈跟踪,请欢迎每一个建议。

entity framework version 5

1 个答案:

答案 0 :(得分:1)

你的repro中有一个缺失的部分,但我发现其他人报告相同/类似的问题here所以我将使用他们的例子。这是repro:

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Meeting> Meeting { get; set; }
}

public class Meeting
{
    public int MeetingID { get; set; }

    [ForeignKey("Customer")]
    public int CustomerID { get; set; }

    public virtual Person Customer { get; set; }

    [ForeignKey("SalesAgent")]
    public int SalesAgentID { get; set; }

    public virtual Person SalesAgent { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Meeting> Meetings { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Meeting>().HasRequired(m => m.Customer).WithMany(p => p.Meeting);
        modelBuilder.Entity<Meeting>().HasRequired(m => m.SalesAgent).WithMany(p => p.Meeting);
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (var ctx = new MyContext())
        {
            EdmxWriter.WriteEdmx(ctx, XmlWriter.Create(Console.Out, new XmlWriterSettings { Indent = true }));
        }
    }
}

EF5中存在导致NullReferenceException的错误。由于不同的bug,这在EF6中不起作用,但我相信这里没有一个真正相关。我认为这里的目的是将一个导航属性从Person实体映射到Meeting实体的两个导航属性,而EF不支持这一点(同样,您不能仅通过查看Person.Meeting的内容来判断收集用户是作为客户还是作为销售代理(或两者兼而有之)进行会议 - 您必须比较键值/引用 - EF只是不这样做。要解决此问题,需要按如下方式更改模型:

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<Meeting> MeetingsAsCustomer { get; set; }

    public virtual ICollection<Meeting> MeetingAsSalesAgent { get; set; }
}

public class Meeting
{
    public int MeetingID { get; set; }

    [ForeignKey("Customer")]
    public int CustomerID { get; set; }

    public virtual Person Customer { get; set; }

    [ForeignKey("SalesAgent")]
    public int SalesAgentID { get; set; }

    public virtual Person SalesAgent { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Meeting> Meetings { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Meeting>().HasRequired(m => m.Customer).WithMany(p => p.MeetingsAsCustomer);
        modelBuilder.Entity<Meeting>().HasRequired(m => m.SalesAgent).WithMany(p => p.MeetingAsSalesAgent);

    }

现在,我们在Person属性上有两个导航属性,这些属性映射到会议实体上的相应导航属性。