Объект MVC3 с коллекцией дочерних объектов

#asp.net-mvc #object #nested-lists

#asp.net-mvc #объект #вложенные списки

Вопрос:

У меня есть проект MVC3 в C#.Net . У меня есть Object1 со списком Object2…

     //navigation Property(s)
    public virtual ICollection<Object2> Object2s { get; set; }
  

Object2 имеет свойство Object1 и свойство Object1_Id

     public int Object1_Id { get; set; }
    public virtual Object1 Object1 { get; set; }
  

Когда я запускаю представление индекса для Object2, я получаю сообщение «Недопустимое имя столбца ‘Object1_Id1′». Weird….it ищет автоматическую колонку. Когда я удаляю Object1_Id из Object2, все работает нормально, пока я не перейду к сохранению в представлении создания. Затем он выдает сообщение об ошибке:

 {"Cannot insert the value NULL into column 'Object1_Id', table 'dbo.Object2'; column does not allow nulls. INSERT fails.rnThe statement has been terminated."}
  

Я уверен, что мне просто не хватает простого шага. Есть идеи?

Комментарии:

1. Я предполагаю, что вы используете подход, основанный на коде?

2. @Водяной знак … да… есть идеи? Я не могу изменить базу данных из кода. администратор должен это сделать

Ответ №1:

Вы хотите использовать fluent API для внесения изменений. Вы можете сделать это в своем классе контекста БД. Посмотрите в нижнюю часть страницы по этой ссылке, чтобы увидеть пример использования fluent API.

http://www.asp.net/entity-framework/tutorials/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

     public class ObjectContext : DbContext
    {
        public DbSet<Object1> Object1s{ get; set; }
        public DbSet<Object2> Object2s{ get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Entity<Object2>()
                .HasOptional(o => o.Object1).WithRequired(o => o.Object2);
        }
    }
  

Комментарии:

1. Я думаю, что я неправильно понял взаимосвязь между вашими объектами, когда я ответил этим, но дайте мне знать, что работает, и я отредактирую окончательный ответ, чтобы отразить его. Возможно, вам придется поменять местами объекты в инструкции ModelBuilder, чтобы заставить его работать именно так, как вы хотите.

Ответ №2:

Я понял свой вопрос. Когда я вызываю действие Create post на моем контроллере Object2, я извлекаю родительский Объект1, создаю идентификатор Guid для моего нового Объекта2, добавляю новый Объект2 к Объекту1.Коллекция Object2s, установите состояние Object1 на измененное, затем сохраните базу данных:

             var object1ToUpdate = db.Object1s.Where(
                    aObject1 => aObject1.Id.Equals(myId)
                ).Include(aObject1 => aObject1.Object2s).Single();
            string id = Guid.NewGuid().ToString();
            Object2.Id = Guid.NewGuid();
            object1ToUpdate.Object2s.Add(Object2);
            db.Entry(object1ToUpdate).State = EntityState.Modified;
            db.SaveChanges();