3

我在与 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)
--Name

我已经用种子填充了它,这是一个示例:

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

家庭控制器.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如果我真的需要,我现在可以返回我的值。

我在这里找到了这个网站的解决方案

4

1 回答 1

1

实体框架不会做不必要的关系。如果要包含其他表,则需要调用方法或将属性设为虚拟以建立惰性关系。

public virtual City City { get; set; }

这样,懒惰模式就形成了。

var model = _db.Persons.Include("City").ToList();

这种方式是在必要时手动包含关系表的方法。

如果您只想打电话给一个人而不是加入,只需打电话_db.Persons.ToList();

于 2013-08-15T05:51:10.367 回答