【问题标题】:CodeFirst One to Many Viewmodel to View要查看的 CodeFirst 一对多 Viewmodel
【发布时间】:2013-10-27 07:07:54
【问题描述】:

使用 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 可以在同一页面或不同页面上完成,以更容易编码为准。

【问题讨论】:

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


    【解决方案1】:

    嘿,我还没有从事过手机开发工作,但这一切的逻辑几乎相同 尝试使用 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);
    }
    

    这么好的东西应该不错:)

    祝你编码愉快!

    干杯!

    【讨论】:

    • 哦,我是在做互联网应用开发,不是手机。但我实际上想稍后再做。感谢你的回答;给我一些,我会深入检查。
    • 我写的是 Web 应用程序 :) 是的,慢慢来。告诉我我的代码是否对你有用,或者至少对你有帮助!干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多