5

我一直在我的 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.
4

1 回答 1

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 }));
        }
    }
}

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);

    }

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

于 2013-09-12T23:17:20.470 回答