Asp.net mvc 具有子对象集合的MVC3对象

Asp.net mvc 具有子对象集合的MVC3对象,asp.net-mvc,object,nested-lists,Asp.net Mvc,Object,Nested Lists,我在C#Net中有一个MVC3项目。我有Object1和Object2的列表 //navigation Property(s) public virtual ICollection<Object2> Object2s { get; set; } 当我运行Object2的索引视图时,会收到消息“无效列名'Object1_Id1'”。奇怪……它正在寻找一个自动专栏。当我从Object2中删除Object1_Id时,它可以正常工作,直到我在创建视图中进行保存。然后抛出一条

我在C#Net中有一个MVC3项目。我有Object1和Object2的列表

    //navigation Property(s)
    public virtual ICollection<Object2> Object2s { get; set; }
当我运行Object2的索引视图时,会收到消息“无效列名'Object1_Id1'”。奇怪……它正在寻找一个自动专栏。当我从Object2中删除Object1_Id时,它可以正常工作,直到我在创建视图中进行保存。然后抛出一条错误消息:

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

我肯定我错过了一个简单的步骤。有什么想法吗?

您想使用fluent API进行调整。可以在DB上下文类中执行此操作。查看此链接页面的底部,可以看到使用fluent API的示例

公共类ObjectContext:DbContext
{
公共DbSet Object1s{get;set;}
公共DbSet Object2s{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.has可选(o=>o.Object1).WithRequired(o=>o.Object2);
}
}

我想出了我的问题。在我的Object2控制器上调用Create post操作时,我检索父Object1,为我的新Object2创建Guid,将新Object2添加到Object1.Object2s集合,将Object1状态设置为modified,然后保存数据库:

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

我猜您使用的是代码优先的方法?@Watermark…是的…有什么想法吗?我无法从代码中修改DB。管理员必须这样做,我想当我回答这个问题时,我误解了你的对象之间的关系,但是请让我知道什么是有效的,我将编辑最终答案以反映它。您可能需要交换modelBuilder语句中的对象,以使其完全按照您想要的方式工作。
    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);
        }
    }
            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();