2012-03-19 3 views
0

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

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

для упрощения публикации Я создал тестовый проект, который сводит проблему до ее простейшей формы.

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

  • а, который имеет имеет дополнительный б и дополнительный с
  • б, который имеет коллекцию через х, а в colleciton С в
  • с, который имеет по желанию б и взимание этого

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

    , когда я выполняю код уаг а = с о в db.a выберите о, я получаю ошибку, описанную выше. Нет абсолютно никакой информации о том, что такое hapenning, поэтому я действительно не знаю, куда обратиться. Может ли кто-нибудь помочь мне решить эту проблему, так как я действительно хочу отойти от модели 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(); 
         } 
    
        } 
    } 
    

ответ

3

Mixup текучей конфигурации и данных аннотаций причины этой проблемы. Команда 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); 
    } 
} 
+0

, что устраняет проблему. Благодарю. Кажется, что вы должны иметь возможность смешивать и сопоставлять аннотации и свободный синтаксис, но я думаю, что я переключусь на бегство на все – Kevin

1

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

var a = from o in db.a.ToList() select o; 
+0

Это дает ту же самую проблему. Проблема заключается в создании модели. – Kevin

Смежные вопросы