代码之家  ›  专栏  ›  技术社区  ›  Nick Fleetwood

编码第一个一对多视图要查看的模型

  •  -1
  • Nick Fleetwood  · 技术社区  · 11 年前

    使用C#、VS2012、MVC4、CodeFirst

    我在这里和其他地方读过很多关于一对多视图模型的帖子,但我不太明白。

    我有一个程序,AddressBook,有两个表,Name和Phone。对于每个名字,你可以有很多数字。以下型号:

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

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

    1 回复  |  直到 11 年前
        1
  •  0
  •   photowalker    10 年前

    嘿,我还没有从事手机开发工作,但这一切都有着几乎相同的逻辑 尝试使用Fluent API,您可以在 here

    现在你想做的是从制作两个课程开始 平民的 很多人都会忘记这一点,所以这就是为什么我必须说出来,但你已经有了,这很好:) 所以一个名字可以有很多号码(电话?)

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

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

    玩得开心,编码伙伴!

    干杯