【问题标题】:How to set Foreign Key object using Entity Framework and FluentHtml如何使用实体框架和 FluentHtml 设置外键对象
【发布时间】:2009-11-05 17:53:27
【问题描述】:

我要做的是通过 FluentHtml 在 EF 实体中设置外键对象。我有一个 Foo 实体,它通过 Foo.Bar 引用了对象 Bar。我想要做的是在我的视图表单中设置 Bar 的值。我的模型通过 Model.Bars 包含所有 Bars 的集合。在我看来,我只是在使用<%= this.Select(m => m.Foo.Bar).Options(Model.Bars) %>,但模型状态声称它无效。下拉列表中正确填充了 Bar id,并且看起来都有效。在我的表单中设置 EF 实体引用属性是否需要一些特殊的魔法?

我刚从 Linq2SQL 移过来,我只是使用 Select(m => m.Foo.BarId),因为您可以映射键引用以及对象。但是,Entity Framework 不允许这样做。

【问题讨论】:

    标签: c# entity-framework mvccontrib fluenthtml


    【解决方案1】:

    您遇到了使用业务对象作为视图模型所带来的诸多复杂情况之一。我可能会建议,从长远来看,如果您将业务对象转换为轻量级视图模型以进行渲染和绑定,那么麻烦会少得多。让您的服务层(或控制器,如果必须的话)弄清楚如何根据 EditFoo.BarId 设置 Foo.Bar。

    【讨论】:

    • 我真的希望asp.net 可以在这方面发挥一些作用。我希望避免为了取悦视图而不得不维护两个几乎相同的对象。
    • Monorail(MS MVC 的灵感来源)有这个:ARDataBind。使用它后,我可以证明,起初感觉像是缓解疼痛的东西会严重损害可维护性、可测试性和可扩展性。将持久性问题放入 UI = 不好。关于“几乎相同”的对象,请查看 AutoMapper。但是,如果您的对象几乎相同,您可能会陷入贫血的领域反模式。
    【解决方案2】:

    我不知道 FluentHtml。但是关于 EF:

    1. EF 4.0 让您拥有“外键关联”,让您可以像 L2S 一样引用 m.Foo.BarId。
    2. 在 EF 1 中,或在 EF 4 中使用“独立关联”,您需要执行 m.Foo.Bar.Id(注意额外的点),前提是已加载 Bar。

    【讨论】:

    • 栏未加载。这用于创建一个新的 Foo。使用标准 Html 助手,我想做 Html.DropdownList("Foo.Bar", Model.Bars)。
    • 那么您必须 (1) 加载 Bar,或 (2) 从 BarReference.EntityKey.Values[0] 获取值。也就是说,我从不使用实体作为视图模型。我创建与页面匹配的专用视图模型并编写 L2E 投影来填充它们。当你这样做时,你永远不必担心加载;它是完全自动的,无需您考虑。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2020-04-14
    • 1970-01-01
    • 2010-10-03
    • 2017-01-30
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多