如何使用 Entity Framework 在 ASP .NET MVC 中创建和初始化没有视图的对象?
How to create and initialize an object without a View in ASP .NET MVC with Entity Framework?
我在本地数据库中有两个 tables 电影和租借。 Rental 有一个名为 itemID 的字段,它是对 Movie 中 id 的外键引用。
我对两个 table 使用了 Entity Framework,这反过来又创建了以下两个 类:
public partial class Movie
{
public int id { get; set; }
public string name { get; set; }
public virtual Rental Rental { get; set; }
}
public partial class Rental
{
public int id { get; set; }
public int itemID { get; set; }
public string renterName { get; set; }
public System.DateTime date { get; set; }
public virtual Movie Movie { get; set; }
}
我想在 /Movie/Details/2 期间在 RentalController 中创建一个 Rental 对象。因此,我将 Movie/Details.cshtml 修改为以下内容:
@model Project.Models.Movie
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Movie</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.name)
</dt>
<dd>
@Html.Raw(Model.name)
</dd>
<dd>
@using (Html.BeginForm("Create", "Rental", new { id = Model.id, returnURL = HttpContext.Current.Request.Url.AbsolutePath }, FormMethod.Post, new { @id = "createForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<a class="navbar-nav" href="javascript:document.getElementById('createForm').submit()">Rent</a>
}
</dd>
</dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.id }) |
@Html.ActionLink("Back to List", "Index")
</p>
这是我迷路的地方。如何创建 Rental 对象并将其正确保存到数据库?
public class RentalController : Controller
{
private CatalogEntities db = new CatalogEntities();
// POST: Rental/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(int id, string returnURL)
{
Rental rental = new Rental() { itemID = id, renterName = "User" };
db.Rentals.Add(rental);
db.SaveChanges();
return Redirect(returnURL);
}
}
虽然我在单击 租用 后没有收到错误消息,但没有条目添加到租用 table。我想知道是否是因为出租对象对 Movie 属性 有一个空引用,而那个特定的 Movie 对象没有对出租对象的引用。即便如此,我还是不知道如何将 Movie 对象从视图传递到控制器。
我终于明白了。它显然工作得更早,只是我查询错了。这就解释了为什么当它被写回数据库时我没有收到任何错误。
回到手头的问题,为了创建和初始化一个对象并引用另一个对象,您只需要使用正确的键引用创建该对象,即电影 ID itemID。虽然在 特定 运行 时间 期间新对象对 Series 的引用为空,但足以用于写回数据库。因此,下面的代码真的是我所需要的:
Rental rental = new Rental() { itemID = id };
db.Rentals.Add(rental);
db.SaveChanges();
之所以可行,是因为当页面被重定向时,数据库会再次读取并重新创建所有 Rental 对象。如果正确引用新的 Rental 对象,它会自动加载正确的 Movie 对象并将其附加到新的 Rental 对象。
我在本地数据库中有两个 tables 电影和租借。 Rental 有一个名为 itemID 的字段,它是对 Movie 中 id 的外键引用。
我对两个 table 使用了 Entity Framework,这反过来又创建了以下两个 类:
public partial class Movie
{
public int id { get; set; }
public string name { get; set; }
public virtual Rental Rental { get; set; }
}
public partial class Rental
{
public int id { get; set; }
public int itemID { get; set; }
public string renterName { get; set; }
public System.DateTime date { get; set; }
public virtual Movie Movie { get; set; }
}
我想在 /Movie/Details/2 期间在 RentalController 中创建一个 Rental 对象。因此,我将 Movie/Details.cshtml 修改为以下内容:
@model Project.Models.Movie
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Movie</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.name)
</dt>
<dd>
@Html.Raw(Model.name)
</dd>
<dd>
@using (Html.BeginForm("Create", "Rental", new { id = Model.id, returnURL = HttpContext.Current.Request.Url.AbsolutePath }, FormMethod.Post, new { @id = "createForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<a class="navbar-nav" href="javascript:document.getElementById('createForm').submit()">Rent</a>
}
</dd>
</dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.id }) |
@Html.ActionLink("Back to List", "Index")
</p>
这是我迷路的地方。如何创建 Rental 对象并将其正确保存到数据库?
public class RentalController : Controller
{
private CatalogEntities db = new CatalogEntities();
// POST: Rental/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(int id, string returnURL)
{
Rental rental = new Rental() { itemID = id, renterName = "User" };
db.Rentals.Add(rental);
db.SaveChanges();
return Redirect(returnURL);
}
}
虽然我在单击 租用 后没有收到错误消息,但没有条目添加到租用 table。我想知道是否是因为出租对象对 Movie 属性 有一个空引用,而那个特定的 Movie 对象没有对出租对象的引用。即便如此,我还是不知道如何将 Movie 对象从视图传递到控制器。
我终于明白了。它显然工作得更早,只是我查询错了。这就解释了为什么当它被写回数据库时我没有收到任何错误。
回到手头的问题,为了创建和初始化一个对象并引用另一个对象,您只需要使用正确的键引用创建该对象,即电影 ID itemID。虽然在 特定 运行 时间 期间新对象对 Series 的引用为空,但足以用于写回数据库。因此,下面的代码真的是我所需要的:
Rental rental = new Rental() { itemID = id };
db.Rentals.Add(rental);
db.SaveChanges();
之所以可行,是因为当页面被重定向时,数据库会再次读取并重新创建所有 Rental 对象。如果正确引用新的 Rental 对象,它会自动加载正确的 Movie 对象并将其附加到新的 Rental 对象。