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

したがって、これにより、データベースは見栄えの良い関係を作成し、非常にうまく機能することがわかりました。このコードの後に​​、次のようなテーブルがあります。

Person
--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>

null 例外が発生します...

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で解決策を見つけました

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 に答える