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

Ciz*_*hil 5 c# asp.net-mvc entity-framework

我一直在我的mvc项目中使用实体框架代码首次迁移.但最近在修改我的模型类并添加新模型后,当我尝试在包管理器控制台中使用add-migration时,我不断收到此错误:'对象引用未设置为对象的实例'我正在使用entity framework version 5,当我尝试使用版本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.
Run Code Online (Sandbox Code Playgroud)

Paw*_*wel 1

您的重现中缺少一部分,但我发现其他人在这里报告了相同/类似的问题,因此我将使用他们的示例。这是重现:

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 }));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

EF5 中存在导致 NullReferenceException 的错误。由于不同的错误,这在 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);

    }
Run Code Online (Sandbox Code Playgroud)

现在,Person 属性上有两个导航属性,它们映射到 Meeting 实体上相应的导航属性。