【问题标题】:one to one relationship between two models?两个模型之间的一对一关系?
【发布时间】:2013-02-17 02:19:51
【问题描述】:

我有以下模型类(我首先使用 EF 代码生成表)。

public class MyClass
{
    ....
    [Required, ForeignKey("Address")]
    public int Address1Id { get; set; }
    virtual public Address Address1 { get; set; }
    [Required, ForeignKey("Address")]
    public int Address12d { get; set; }
    virtual public Address Address2 { get; set; }
    [Required, ForeignKey("Address")]
    public int Address3Id { get; set; }
    virtual public Address Address3 { get; set; }
    ....
}
public class Address { .... }

我希望MyClass 的创建视图显示所有地址字段,并且在保存MyClass 时,地址将首先保存在地址表中。但是脚手架为地址生成了一个 DropDownList 框。如何修改代码,使其像这些地址字段直接编码在类MyClass中一样,让控制器将表AddressAddressID中的地址保存在表MyClass中?

    <div class="editor-label">
        @Html.LabelFor(model => model.Address1Id, "Address")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Address1Id", String.Empty)
        @Html.ValidationMessageFor(model => model.Address1Id)
    </div>

更新: 我尝试创建以下 ViewModel,但脚手架抱怨类中没有定义键。

public class DealViewModel
{
    public Deal Deal { get; set; }
    public Address Address { get; set; }
}

【问题讨论】:

  • 这是 MVC 还是 EF 问题。 MVC 可以使用这样的模型。 EF 需要一个适合密钥的类型。复杂类型适合作为数据库键。你希望达到什么目标?

标签: c# asp.net asp.net-mvc-3 entity-framework asp.net-mvc-4


【解决方案1】:

你的外键属性不正确:

[Required, ForeignKey("Address1")]
...
[Required, ForeignKey("Address2")]
...
[Required, ForeignKey("Address3")]
...

(我猜Address12d 是一个错字)

【讨论】:

    【解决方案2】:

    听起来您在问如何在 MVC 中为编辑/创建视图展平模型。您不想先创建一个 Person,然后再创建一个 Address,而是在一个屏幕中创建它。如果这就是您要问的,是的,您可以做到!事实上,做你想做的事情就像将你的创建视图更改为这样的简单:

    <h3>Address 1</h3>
    @Html.EditorFor(x => x.Address1)
    <h3>Address 2</h3>
    @Html.EditorFor(x => x.Address2)
    ...etc
    

    默认情况下,MVC 足够聪明,可以猜测Address 的“编辑器”应该是什么样子。字符串的文本字段、布尔值的复选框等。如果您的 [HttpPost] 控制器看起来像这样:

    [HttpPost]
    public ActionResult Create(Person person)
    {
        if (ModelState.IsValid)
        {
            var context = new AppDbContext();
            context.People.Add(person);
            context.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(personViewModel);
    }
    

    如果您在调试器中检查person,您应该会看到Address 属性已全部填写。是的,MVC ModelBinder 就是这么聪明!你不应该做任何其他事情。

    注意:随着项目的进展和数据模型不可避免地变得更加复杂,您可能会遇到从控制器到视图来回传递模型对象的问题。我强烈建议遵循使用 ViewModel 的模式,它们是代表视图“模型”的普通对象,也就是说,它应该捆绑所有进出客户端的数据。这将允许您展平数据模型并仅包含您实际需要的字段。对于这个特定示例,您可能不需要使用此模式,但它会在未来有所帮助。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      相关资源
      最近更新 更多