-1

使用 C#、VS2012、MVC4、CodeFirst

我已经在这里和其他地方阅读了大量关于一对多视图模型的帖子,但我不太明白。

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

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

我的详细视图模型:

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

4

1 回答 1

0

嘿,我还没有从事电话开发工作,但是这一切都涉及到几乎相同的逻辑尝试使用 Fluent API,您可以在此处阅读更多信息

现在你想要做的是首先让你的两个班级都公开很多使用这个的人可能会忘记它,所以这就是为什么我不得不说但你已经有了它,这很好:)所以一个名字可以有很多数字(电话?)

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

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

玩得开心编码伙伴!

干杯!

于 2013-10-27T07:28:12.937 回答