我在一个本地数据库里有两张桌子--电影和租赁。租房有一个名为itemID的字段,它是对Movie中id的外键引用。
我对这两个表使用了实体框架,这两个表依次创建了以下两个类:
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/2中在RentalController中创建一个租房对象。因此,我将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>
这就是我迷失自我的地方。如何创建租房对象并将其正确保存到数据库中?
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);
}
}
虽然在单击Rent后没有收到错误,但是没有向Rental添加任何条目。我想知道是否因为租房对象对Movie属性的引用为null,而特定的Movie对象没有对出租对象的引用。即使如此,我还是想不出如何将Movie对象从视图传递到控制器。
发布于 2018-10-23 08:22:41
我终于想出来了。很明显它之前起作用了,只是我问错了。这就解释了为什么我在将错误写回数据库时没有得到任何错误。
回到前面的问题,为了创建和初始化一个带有对另一个对象的引用的对象,您只需要使用正确的键引用创建该对象,即被称为itemID的Movie。虽然在(那个特定的运行时)期间,对新对象Series的引用为null,但只需将其写回数据库就足够了。因此,下面的代码就是我真正需要的:
Rental rental = new Rental() { itemID = id };
db.Rentals.Add(rental);
db.SaveChanges();
之所以这样做,是因为当页面被重定向时,数据库会再次被读取,并且所有的租房对象都会被重新创建。如果新的租赁对象被正确引用,它将自动加载正确的电影对象并将其附加到新的租赁对象。
https://stackoverflow.com/questions/52809069
复制相似问题