Как создать и инициализировать объект без представления в ASP .NET MVC с Entity Framework? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть две таблицы Movie и Rental в локальной базе данных.В Rental есть поле под названием itemID, которое является внешним ключом для ссылки на id в Movie.

Я использовал 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; }
}

Я хочу создать объект Rental в RentalController, находясь в / Movie / Details / 2.Таким образом, я изменил 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);
    }
}

Хотя после нажатия на Rent я не получил ошибку, запись в таблице Rental не добавляется.,Интересно, так ли это, потому что объект аренды имеет нулевую ссылку на свойство фильма, а этот конкретный объект фильма не имеет ссылки на объект аренды.Несмотря на это, я не могу понять, как передать этот объект Movie из вида в контроллер.

1 Ответ

0 голосов
/ 23 октября 2018

Я наконец понял это.Очевидно, он работал раньше, за исключением того, что я ошибался.Это объясняет, почему я не получил никакой ошибки, когда она была записана обратно в базу данных.

Возвращаясь к рассматриваемому вопросу, чтобы создать и инициализировать объект со ссылкой на другой объект, выпросто нужно создать этот объект с правильной ключевой ссылкой, которая является идентификатором фильма, именуемым itemID .Хотя ссылка на Series для нового объекта пуста во время этой конкретной среды выполнения , ее достаточно использовать для обратной записи в базу данных.Таким образом, приведенный ниже код - это действительно все, что мне нужно:

Rental rental = new Rental() { itemID = id };
db.Rentals.Add(rental);
db.SaveChanges();

Причина, по которой это работает, заключается в том, что когда страница перенаправляется, база данных снова читается и все объекты Rental воссоздаются.Если на новый объект Rental ссылаются правильно, он автоматически загрузит нужный объект Movie и прикрепит его к новому объекту Rental.

...