代码优先一对多视图模型查看

时间:2013-10-27 07:07:54

标签: c# asp.net-mvc-4 viewmodel code-first one-to-many

使用C#,VS2012,MVC4,CodeFirst

我已经在这里和其他地方阅读了很多关于一对一的视频模型的帖子,但我无法理解它。

我有一个程序,AddressBook,有两个表,名称和电话。对于每个名称,您可以拥有许多数字。以下型号:

namespace AddressBook.Models
{
    public class Name
    {
        public int NameID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        //ref
        public ICollection<Phone> Phones { get; set; }
    }
}

namespace AddressBook.Models
{
    public class Phone
    {
        public int ID { get; set; }
        public string Number { get; set; }

        //ref
        [Required]
        public int NameId { get; set; }
        public Name Name { get; set; }

    }
}

和我的背景:

public class ContactDBContext : DbContext
    {
        public DbSet<Name> Names { get; set; }
        public DbSet<Phone> Phones { get; set; }
    }

我的DetailViewModel:

public class DetailViewModel
    {
        public Name ID { get; set; }
        public Name FirstName { get; set; }
        public Name LastName { get; set; }

        public List<Phone> Number { get; set; }
    }

现在我的控制器,我开始卡住了。我可以拨打电话列表,但我似乎无法获得隔离的姓名记录。

public ActionResult Details(int id = 0)
        {
            DetailViewModel dvm = new DetailViewModel();

            dvm.FirstName = (from n in db.Names select n).Where(m => m.NameID == id).ToString();
            dvm.LastName = (from n in db.Names where n.NameID == id select n).ToString();
            dvm.Number = (from n in db.Phones select n).Where(m => m.NameId == id).ToList();
            //tried a couple of different things

            return View(dvm);


            //Name name = db.Names.Find(id);
            //if (name == null)
            //{
            //    return HttpNotFound();
            //}
            //return View(name);
        }

用户应该能够在详细信息视图中对所选名称记录执行一次电话表格上的CRUD。手机CRUD可以在相同或不同的页面上完成,以较容易编码为准。

1 个答案:

答案 0 :(得分:0)

嘿,我还没有从事电话开发,但这几乎都是相同的逻辑 尝试使用Fluent API,您可以在here

中了解更多信息

现在你要做的就是首先让你的两个课程公开很多ppl一起工作,这可以忘记它,这就是为什么我必须说出来,但你已经拥有它并且那就是好:) 所以一个名字可以有很多号码(电话?)

namespace AddressBook.Models
{
    public class Name
    {
        public Name ()
        {
          PhoneList = new List<Phone>(); // just so you wont end up with a null reference if you have not yet provided any data.
        }
        public int NameID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        //ref
        public virtual ICollection<Phone> Phones { get; set; }  //added the virtual
    }
}

现在到您的手机课

namespace AddressBook.Models
{
    public class Phone
    {
        public Phone(){}
        public int ID { get; set; }
        public string Number { get; set; }

        public virtual Name Name { get; set; }

    }
}

现在你OnModelCrating你可以说什么是必需的,什么有很多什么:)这样的事情

Protected override void OnModelCrateing(DbModelBuilder modelBuilder)
{
  mobelbuilder.Entity<Name>().HasRequired<Phone>.(n=>n.ID).WithMany(n=>n.PhoneList).HasForeignKey(n=>n.NameID);
}

这个好的东西应该是好的:)

有乐趣的编码伴侣!

干杯!