带有子对象集合的MVC3对象

时间:2011-10-10 20:28:01

标签: asp.net-mvc object nested-lists

我在C#.Net中有一个MVC3项目。我的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'”。奇怪......它正在寻找一个自动化的专栏。当我从Object2中删除Object1_Id时,它会很好,直到我在Create View中保存。然后它会抛出一条错误消息:

{"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."}

我确信我只是错过了一个简单的步骤。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您想使用流畅的API进行调整。您可以在DB Context类中执行此操作。请查看此链接页面的底部,以查看使用流畅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 :(得分:1)

我想出了我的问题。当我在我的Object2 Controller上调用Create post动作时,我检索父Object1,为我的新Object2创建一个Guid,将新的Object2添加到Object1.Object2s集合,将Object1状态设置为modified,然后保存db:

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