Объект EntityFramework не установлен в экземпляр объекта при создании модели - PullRequest
0 голосов
/ 20 марта 2012

Я некоторое время боролся за то, чтобы преобразовать довольно большую базу данных EntityFramework, созданную сначала в модели, в codefirst.У меня проблема, которую я не могу решить.Я получаю ссылку на объект, не установленную для экземпляра объекта со следующими процедурами в стеке вызовов.

ModelConfiguration.Configuration.Types.EntityTypeConfiguration.Configure
ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntities

, чтобы упростить публикацию. Я создал тестовый проект, который сводит проблему к ее простейшемуform.

У меня есть 3 класса

  • a, у которых есть необязательный b и необязательный c
  • b, у которого есть коллекция из a и коллекцияc's
  • c, который имеет необязательный b и набор из a

    public class a
    {
        public int Id { get; set; }
        [Required]
        public string name { get; set; }
    
        public virtual b b { get; set; }
        [ForeignKey("b")]
        public int? b_Id { get; set; }
    
        public virtual c c { get; set; }
        [ForeignKey("c")]
        public int? c_Id { get; set; }
    }
    
    public class b
    {
        public int Id { get; set; }
        public string name { get; set; }
    
        public virtual ICollection<a> a_s { get; set; }
        public virtual ICollection<c> c_s { get; set; }
    }
    
    public class c
    {
        public int Id { get; set; }
    
        public virtual b b { get; set; }
        [ForeignKey("b")]
        public int? b_Id { get; set; }
    
        public virtual ICollection<a> a_s { get; set; }
    }
    
    public class MyContext : DbContext
    {
        public DbSet<a> a { get; set; }
        public DbSet<b> b { get; set; }
        public DbSet<c> c { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<a>()
                .HasOptional(m => m.b)
                .WithMany(m => m.a_s);
    
            modelBuilder.Entity<b>()
                .HasMany(m => m.c_s)
                .WithRequired(m => m.b);
    
            modelBuilder.Entity<c>()
                .HasMany(m => m.a_s)
                .WithOptional(m => m.c);
    
            base.OnModelCreating(modelBuilder);
        }
    
    }
    

    , когда я выполняю код var a = from o в db.a выберите o, я получаюошибка описана выше.Там нет абсолютно никакой информации о том, что происходит, поэтому я действительно не знаю, куда обратиться.Может кто-нибудь помочь мне решить эту проблему, так как я действительно хочу отойти от Model First.

    namespace MvcApplication2.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                var db = new MyContext();
    
                var a = from o in db.a select o;
    
                return View();
            }
    
        }
    }
    

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Эта проблема возникла из-за смешения конфигурации и аннотации данных. Команда EF должна была обработать это исключение и выдать значимое сообщение об ошибке.

Удалить аннотации данных и использовать текущие настройки следующим образом

public class a
{
    public int Id { get; set; }

    [Required]
    public string name { get; set; }

    public virtual b b { get; set; }

    public int? b_Id { get; set; }

    public virtual c c { get; set; }

    public int? c_Id { get; set; }
}

public class b
{
    public int Id { get; set; }
    public string name { get; set; }

    public virtual ICollection<a> a_s { get; set; }
    public virtual ICollection<c> c_s { get; set; }
}

public class c
{
    public int Id { get; set; }

    public virtual b b { get; set; }

    public int? b_Id { get; set; }

    public virtual ICollection<a> a_s { get; set; }
}

public class NreContext : DbContext
{
    public DbSet<a> a { get; set; }
    public DbSet<b> b { get; set; }
    public DbSet<c> c { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<a>()
            .HasOptional(m => m.b)
            .WithMany(m => m.a_s)
            .HasForeignKey(m => m.b_Id);

        modelBuilder.Entity<a>()
            .HasOptional(m => m.c)
            .WithMany(m => m.a_s)
            .HasForeignKey(m => m.c_Id);

        modelBuilder.Entity<c>()
            .HasOptional(m => m.b)
            .WithMany(m => m.c_s)
            .HasForeignKey(m => m.b_Id);

        base.OnModelCreating(modelBuilder);
    }
}
1 голос
/ 20 марта 2012

Попробуйте поместить 'a' в локальную память:

var a = from o in db.a.ToList() select o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...