2011-10-10 63 views
2

我在C#.Net中有一个MVC3项目。我有object1带有对象2列表...具有子对象集合的MVC3对象

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

对象2有一个Object1财产和财产Object1_Id

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

当我运行索引视图的对象2我得到的消息“无效的列名'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."} 

我相信我只是想念一个简单的步骤。有任何想法吗?

+0

我猜你正在使用Code-First方法? –

+0

@Watermark ...是的...有什么想法?我无法从代码修改数据库。管理员必须这样做 – MikeTWebb

回答

1

我想通了,我的问题。当我在Object2控制器上调用Create post操作时,我检索父Object1,为我的新Object2创建一个Guid,将新Object2添加到Object1.Object2s集合,设置Object1状态为已修改,然后保存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(); 
1

您想使用流利的API进行调整。您可以在您的数据库上下文类中执行此操作。查看此链接页面的底部以查看使用流利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); 
     } 
    } 
+0

我想我误解了你的对象之间的关系,当我回答这个问题时,让我知道什么有效,我会编辑最终答案以反映它。您可能不得不在模型构建器语句中换出对象以使其按照您想要的方式工作。 –