我对ASP.NET MVC4和CodeFirst的关系存在一些问题,同时返回与这些与外键相关的表的值。
首先,让我们看看我是否正确地做到了。
以下是我的代码示例:
public class Person {
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public City City { get; set; }
}
public class City {
public int Id { get; set; }
public string Name { get; set; }
}
因此,通过这个,数据库创建了一个漂亮的关系,并且它可以很好地工作。我有这个代码,像这样的表:
人
--Id(PK)
--name
--Surname
--City_Id(FK)
市
--Id(PK)
- 名称
我用种子填充了这个,这是一个例子:
context.Person.AddOrUpdate(p => p.Name,
new Person { Name = "Me", City = new City { Name = "Ludlow" } }
);
当我需要将信息检索到视图时,就像这样......
MyDataBase.cs
public class LeilaoDb : DbContext
{
public DbSet<Person> Persons { get; set; }
public DbSet<City> Cities { get; set; }
}
HomeController.cs
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.ToList();
return View(model);
}
主/ Index.cshtml
@model IEnumerable<testingproject.Models.Person>
@{
ViewBag.Title = "Home Page";
}
@foreach (var item in Model)
{
@Html.Partial( "_Person", item );
}
_Person.cshtml
@model testingproject.Models.Person
<div>
<h3>@Model.Name</h3>
@Model.City.Name
</div>
我收到一个空例外......
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
那么,出了什么问题?
我找到了解决方案,
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.ToList();
return View(model);
}
此代码仅检索人员,可能在没有必要进行关系时不会超载。您需要指定何时需要使用Include()
方法执行这些关系。
在此之后,很简单:
MyDataBase _db = new MyDataBase();
public ActionResult Index()
{
var model = _db.Persons.Include("City");
return View(model);
}
我觉得把字符串传递给这个方法很奇怪,但没关系。如果我真的需要,我现在可以用@Model.City.Name
返回我的值。
我在本网站找到了解决方案here
答案 0 :(得分:1)
权利框架不会建立不必要的关系。如果要包含其他表,则需要调用方法或将属性设置为虚拟以进行惰性关系。
public virtual City City { get; set; }
var model = _db.Persons.Include("City").ToList();
这种方法是在必要时手动包含关系表的方法。
如果您只是打电话给某人而不进行加入,请拨打_db.Persons.ToList();