我一直在我的mvc项目中使用实体框架代码第一次迁移。但是最近在修改了我的模型类并添加了新的类之后,当我尝试在包管理器控制台中使用添加迁移时,我一直收到这样的错误:“对象引用没有设置为一个对象的实例”,我使用的是entity framework version 5,当我尝试使用version 6但它不会看到我的DbContext时,这里是我的堆栈跟踪,请欢迎所有建议。
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.Configure(EdmEntityType entityType, EdmModel model)
   at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntities(EdmModel model)
   at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer)
   at System.Data.Entity.Migrations.Extensions.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w)
   at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(Action`1 writeXml)
   at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(DbContext context)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()
   at System.Data.Entity.Migrations.Design.ToolingFacade.GetPendingMigrationsRunner.RunCore()
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
Object reference not set to an instance of an object.发布于 2013-09-12 23:17:20
您的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的错误。这在EF6中也不起作用,因为有一个不同的bug,但我认为这一切在这里都没有实际意义。我认为这里的意图是将Person实体中的一个导航属性映射到来自会议实体的两个导航属性,而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属性上有两个导航属性,它们被映射到会议实体上的相应导航属性。
https://stackoverflow.com/questions/18036902
复制相似问题