4

我正在寻找有关下拉列表选择的体面模式和 POCO EF 选择持久性的建议。

我的视图模型中有一个列表,IEnumerable<Country>其中 Country 是通过 EF 加载的 POCO。视图模型上有一个 Address 属性,它在其 Country 属性上采用当前或用户选择的值。在视图中,我通过 Html.DropdownListFor() 显示这些:

Html.DropDownListFor(model => model.Address.Country.Id, new SelectList(Model.Countries,"Id","Name",model.Address.Country.Id)

到目前为止一切都很好,并且默认 ModelBinder 为我提供了一个填充了 Address.Country 的视图模型,这一切都适用于回发。但是 Address.Country 当然只填充了具有默认模型绑定的 Id 字段。

尝试通过 EF 将地址更新发送回数据库会失败,因为这被视为一个新对象,它没有加载完整的对象图,只有 Id 集。

现在我可以通过在基于所选 ID 保存之前将完整的 Country 对象从 db 加载到回发时的 Address.Country 属性中来解决此问题。但是对于一个简单的对象图之外的任何东西,这似乎都是一项艰巨的工作。

我能想到的最“优雅”的解决方案是 Country 的自定义模型绑定器,但这需要模型绑定器了解用于检索完整 EF 对象的存储库,这对我来说似乎不合适。我还必须对下拉列表中使用的所有其他实体重复此操作。

希望这是有道理的,任何关于其他人如何做到这一点的反馈将不胜感激。

4

2 回答 2

0

如果您将 Address.Country 设置为一个对象,EF 希望它是一个完整的对象,是当前上下文的一部分,但 EF 确实识别外键:如果您的 Address 对象同时具有 CountryID 属性和 Country 属性,它应该接受 Address只要 Address.Country 本身为空,就会设置 .CountryID。

于 2010-10-25T15:33:10.460 回答
0

在您的地址类中,将国家/地区声明为虚拟

public class Address
{
  public virtual Country Country;
}

试试这个,让我知道它是否有效,虚拟支持延迟加载,您不必显式查询

于 2013-01-04T10:26:06.200 回答