【问题标题】:How would I uniquely identify an entity in Entity Framework?如何在实体框架中唯一标识一个实体?
【发布时间】:2009-07-23 01:27:36
【问题描述】:

我将实体框架用作 ASP.Net (webforms) 应用程序的 ORM。假设我的应用程序中有一组“列表/详细信息”页面,当您单击列表页面中的一行时,我想将该行的某种类型的 ID 传递给详细信息页面,然后我会使用从我的数据层加载行。在我的具体情况下,主键只是一个“rowId”标识列。

然而,EF 似乎更喜欢“隐藏”主键/外键,这样您就无法访问它们(默认情况下)。

我是 EF 的新手,我想知道是否有最佳实践来唯一标识实体上下文之外的行。我想我可以在我的记录中添加一个 uniqueidentifier 列,并为我的实体模型添加一个匹配属性,但是为行有效地拥有 2 个唯一标识符似乎是多余的。有没有更好的方法在表示层携带标识符?

在我的 _ItemDataBound() 事件处理程序中,我认为我可以执行以下操作:

var announcement = (Announcement) e.Item.DataItem;
string rowID = announcement.EntityKey.EntityKeyValues[0].Value.ToString();

这是推荐的,还是仅仅针对框架工作?

提前致谢。

斯科特

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    不,您正在做的事情“不符合(实体)框架”。然而,这并不是说它无法改进:

    1. 我知道这不是 MVC,但即使在 WebForms 中,我仍然认为在数据层和网页之间进行一些分离是个好主意。我可能会在这里使用带有表示模型的存储库模式,而不是让页面直接了解实体框架。
    2. 由于您已经将 Announcement 转换为正确的类型,您可以直接访问 ID 值,而不是通过 EntityKey。那么,至少,您的页面只知道 Announcement 而不是 Entity Framework。
    3. 当前代码假定存在一个 EntityKey(并非总是如此,尤其是新插入的尚未提交到数据库的实体)并且它只有一列。测试这些假设并抛出一个有意义的异常是个好主意,而不是让它们在违反时被空引用炸毁。

    【讨论】:

    • 实现存储库模式实际上将是我的下一个重构 :) 我不确定我从哪里得到的印象是 .RowID 属性对我不可用......在这种情况下对我来说很好。关于#3 的好点...我是 EF 的新手,我想知道我应该和不应该用它做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2012-05-23
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多