如何使用具有有效负载的桥接表更新具有多对多联接的表

问题描述

| 我正在建立个人电影目录,并具有以下结构: 电影表/实体 MovieID(PK标识符)+ 其他电影相关属性 人表/实体 PersonID(PK标识符)+ 其他人的相关属性。 人电影表/实体 MovieID(FK) 人名(FK) 其他栏包含有关此人在电影上的行为的信息(例如,角色名称或工作)。 我想拥有一个允许用户创建/更新电影或人的视图,并具有一个复选框,然后允许他们选择现有的或创建新的演员(人)或电影。 我在两个方面努力: 1)如何呈现这种类型的多页数据收集。电影有很多演员,一个人可以参与很多电影。 2)如何根据用户输入内容更新上面表格中的2或3。用户可能想添加电影,但尚不知道演员,反之亦然。用户可能想要添加电影并添加已经作为该电影的演员的人。 另外,我不希望级联删除,并且为上述实体之间的关系而努力将其关闭。 我可以使用Webforms轻松地做到这一点,但是我正在学习MVC 3和Entity Framework 4,并且仍然不遗余力。我环顾四周,还没有遇到关于我要实现的目标的解决方案/教程。 任何帮助将非常感激。 托尼     

解决方法

        当我从另一个MVC框架(Rails与ROR中一样)切换时,我遇到了类似的问题。对于初学者,请查看宽大对类似问题的答复,即:不幸的是,ASP.NET MVC3不明确支持与有效负载的关系或非PJT(纯联接表)。 您可以创建一个ModelView(虚拟实体)来包装其他实体类型的集合,并将其传递给View。前面的文章有详细的示例,其中包含Model,ViewModel,View,Partial和Controller的代码。 (阅读该帖子的两个答案,我的答案是宽大答案的延续) 希望能帮助到你!     ,        Vulcan处在正确的轨道上,她链接的我的回复也将帮助您获得模型设置,链接表中包含额外的数据。 对于构建视图,您很可能会发现ViewModels是进行您所描述的更复杂设置的方法,然后您的控制器和服务层将处理视图模型数据并将其转换为EF实体。视图模型是专门为您所需的视图构建的,而不是尝试将域模型锤入可能不适合它的视图中。 这是用于制作电影的工作流程之一的一个非常粗糙的开始,带有可选的人员列表。 域-您的Movie和Person类,以及一个类似于我在此处描述的链接表。 查看模型-制作电影并附加人物
public class MovieCreatePage
{
    public MovieInput Input { get; set; }  // Form field data...
    public IEnumerable<People> People { get; set; } // list of people for drop downs
    // ... other view data needed ...
}

public class MovieInput
{
    [Required,StringLength(100)]
    public string Name { get; set; }

    // Easiest to just submit a list of Ids rather than domain objects.
    // During the View Model -> Domain Model mapping,there you inflate them.
    public int[] PeopleIds { get; set; }

    // ... other input fields ...
}
Create.cshtml-只需为您的视图模型创建一个表单。 控制器:
// NOTE! The parameter name here matches the property name from the view model!
// Post values will come across as \'Input.Name\',\'Input.Year\',etc...
// Naming the parameter the same as the view model property name will allow
// model binding.  Otherwise,you\'ll need an attribute: [Bind(Prefix=\".....\")]
[HttpPost]
public ActionResult Create(MovieInput input)
{
    if (ModelState.IsValid)
    {
        //
        // Now do your mapping - I\'d suggest Automapper to help automate it,// but for simplicity,lets just do it manually for now.

        var movie = new Movie
        {
            Name = input.Name,Actors = input.PeopleIds != null
                ? input.PeopleIds.Select(id => new Person { Id = id })
                : null
        };

        //
        // Now save to database.  Usually in a service layer,but again,// here for simplicity

        // First,attach the actors as stubbed entities
        if (movie.Actors != null)
        {
            foreach (var actor in movie.Actors)
                _db.People.Attach(actor);  // Attach as unmodified entities
        }

        _db.Movies.Add(movie);
        _db.SaveChanges();

        TempData[\"Message\"] = \"Success!\"; // Save a notice for a successful action
        return RedirectToAction(\"Index\");
    }

    // Validation failed,display form again.
    return View(new MovieCreatePage
    {
        Input = input,// ... etc ...
    });
}
希望这对您有所帮助,并为您指明了正确的方向。当然,它确实提出了许多其他问题,这些问题将花费一些时间(例如,自动映射器,服务层,所有各种EF陷阱等等)。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...