【问题标题】:Mapping Entity Types to a projection将实体类型映射到投影
【发布时间】:2013-03-27 18:35:54
【问题描述】:

我正在阅读教程,他们说您永远不应该使用实体类型来映射到投影。所以这样的事情是不允许的(其中产品是一个实体创建的类):

from p in db.Products
               where p.ProductID== ProductID
               select new Product { Name = p.Name};

所以我会创建一个类似这样的新类:

public string Name { get; set; }

然后使用这样的查询:

from p in db.Products
            where p.ProductID == ProductID
            select new SomeNewClassName { Name = p.Name });

这真的有必要吗,或者这只是额外的工作?如果我要创建这个类,它将拥有与我的实体对象完全相同的属性,那么重点是什么?如果需要,我对这个新类使用的命名约定是什么,因为它几乎与我的 Entity 类相同。我也不应该使用实体对象在 ASP.net MVC 项目中创建强类型视图吗?

【问题讨论】:

    标签: c# linq entity-framework entity


    【解决方案1】:

    他们的意思是您不想使用实际的实体类型作为投影。例如,您不应该从 Person 实体投影到 Address 实体。

    投影意味着您正在“塑造”与原始结果不同的结果。如果您只是返回原始实体,那么这不是投影。您只需这样做:

    from p in db.Products
            where p.ProductID == ProductID
            select p;
    

    至于观点,没有。通常,您不应将实体直接传递给您的视图。有许多哲学和安全原因为什么您不应该这样做,但在大多数情况下只是不这样做。如果您正在创建概念验证,或者它是一个微不足道的内部应用程序,您可能能够侥幸成功,但任何面向互联网的应用程序都不应该这样做。

    您应该创建一个单独的视图模型,即使它与实体完全相同。我知道这是额外的工作,但从长远来看,这是值得的,因为在某些时候你可能想要一个与你的实体不同的视图模型,那么你必须更多地返工。

    【讨论】:

    • 很好,不过有两个跟进。我会给这个新类分类什么,然后有一个标准的命名约定还是应该总是匿名的?其次,如果我不投影数据,那么在强类型 MVC 视图中使用实体类型是否正确?
    • @ios85 - 它不是匿名的,匿名投影是当你简单地说 select new { Foo = Bar } 而没有类型。在您的情况下,结果是IQueryable<Product>。如果您选择一个实体,那么它就是Product。查看我关于视图的更新。
    • 小补充:实体框架甚至不接受前一个查询:无法在 LINQ to Entities 查询中构造实体或复杂类型“Product”
    • @GertArnold - 正确。不仅不建议投影到实体,而且您不能投影到实体。
    • @MystereMan 所以与数据库交互需要我使用实体对象,但是与视图的任何交互都需要我正确使用我的新类(并在必要时查看模型)?在与数据库交互之后,我需要做的只是演员表吗?必须使用与另一个完全相同的类似乎很奇怪。
    猜你喜欢
    • 2018-09-28
    • 2019-03-01
    • 1970-01-01
    • 2020-03-07
    • 2020-01-27
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多