>using 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 可以在相同或不同的页面上完成,以更容易编码的页面为准。
我还没有从事手机开发工作,但这一切都涉及几乎相同的逻辑尝试使用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);
}
这么好的东西应该是好:)
祝您编码愉快!
干杯!