代码之家  ›  专栏  ›  技术社区  ›  mare

模型设计ASP.NETMVC公司

  •  0
  • mare  · 技术社区  · 15 年前

    我总是在MVC中遇到模型设计的问题。大多数情况下,我的所有项目都需要创建、编辑和删除一些实体。这些实体中的大多数都具有一些公共属性,如创建日期、修改日期、作者、修改者,在某些情况下,甚至更具描述性的属性也是常见的。因此,我只有一个DB表来存储它们。例如,Documents表,我们在其中存储发票、报价单和其他业务文档。我将实体框架v4用于ORM,在这里我们最终会得到文档实体。

    如何修改此实体或为其创建单独的DocumentViewModel类以支持具有公共属性的多个文档类型(因此应实现某种形式的继承或接口实现)?除了识别不同的文档类型之外,我还需要一些类型来具有不同的数据注释规则(属性)。

    例如,Document表有PayDate列。单据类型发票要求提供付款日期,但单据类型报价单不要求提供付款日期。

    这是我在使用MVC时反复面临的一个问题,到目前为止,我每次都会处理不同的问题,但无法决定如何正确处理它以实现最大的应用程序可维护性和易开发性。

    2 回复  |  直到 15 年前
        1
  •  2
  •   RPM1984    15 年前

    你有没有考虑过 文件 实体 摘要 ?

    在数据库方面,您将拥有 文件 仅包含所有发票/发票等共享字段的表。此字段将具有标识PK-例如DocId。

    在其他表中,可以存储特定于该文档的其他元数据,PK是一个(非标识)字段DocId,它也是 文件 桌子。

    在英孚方面, 文件 成为 摘要 实体,其他实体继承自此实体。这允许一个好的OO范例存在,并使您的代码更加健壮。

    我们目前正在使用这个方案(EF4/SQL Server)。

    你的场景听起来和我们的非常相似-考虑使用抽象类。

    编辑

    我想我会给我如何实现这个场景添加更多的信息,让你走上正轨。

    作为对您Q状态的评论,我们对您的领域知之甚少,因此很难做出明智的意见。就我个人而言,我选择了 摘要 ,因为某些功能需要一次点击返回一个“混合包”的项目。当然,还有其他方法可以做到这一点(例如存储过程),但这允许在我的UI(顺便说一下,它是MVC)和我的服务层之间有一个很好的流畅接口。

    像这样工作-这是我如何得到一个 单一的 职务:

    // var is strongly-typed to a "Post"
    var somePost = repository.FindSingle(10); 
    

    我是这样得到的 混合袋 职位:

    // var is strongly-typed to a "ICollection<Post>".
    // "Title" is a property on my "Post" abstract POCO
    var mixedBagOfPosts = repository.FindAll<Post>(p => p.Title = "Some Title"); 
    

    以下是我如何获得“评论”的集合(帖子的子项):

    // var is strongly-typed to a "ICollection<Review>"
    // "Rating" is a property on my "Review" POCO (derived from Post)
    var reviews = repository.FindAll<Review>(r => r.Rating == 5.00);
    

    kicker是我的存储库,使用泛型实现,类型参数确保类型安全:

    ICollection<T> FindAll<T>(Expression<Func<T,bool>> predicate) where T : Post
    

    它的实现方式如下:

    return myContext.Posts.OfType<T>.Where(predicate).ToList();
    

    这个 类型 导致T(这是子表)的内部联接,因此只返回那些记录。

    当然,我也有 服务层 在我的UI和存储库之间进行中介,但这应该会让您走上正确的轨道。

    另外,您不必使用整个表达式谓词,我喜欢这样做,因为它可以最小化接口上的方法数量,并为控制器提供完全的查询能力,同时确保查询是 推迟 到服务层的点,但不是更远。

    如果不喜欢这样,当然可以使用常规参数(字符串标题等)。

    正如我所说,这个建筑适合 我的 领域需求,所以它可能不一定适合你的,但希望它能给你一些洞察力。

        2
  •  0
  •   CrazyDart    15 年前

    您可以在EF模型中多次放置一个表,然后将它们重命名为所需的实体。只需删除那些你不需要的列。

    例如,放入文档实体。。。现在将其重命名为Invoice。现在再加一个,并命名为报价。。。在报价单上,单击PayDate并点击delete键。你可以定制这些你想要的!您也可以对其他ORMs做同样的事情,只需要做更多的工作。使用NHibernate,您可以手动创建模型,然后将它们映射到同一个表,但只映射您需要的内容。