我一直在我的mvc项目中使用实体框架代码首次迁移。但最近在修改我的模型类并添加新模型后,当我尝试在包管理器控制台中使用add-migration时,我不断收到此错误:'对象引用未设置为对象的实例'我正在使用{{1}当我尝试使用版本6但它看不到我的 DbContext 时,这是我的堆栈跟踪,请欢迎每一个建议。
entity framework version 5
答案 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属性上有两个导航属性,这些属性映射到会议实体上的相应导航属性。