none
关于entity framework一个困扰我很久的问题 RRS feed

  • 问题

  • 关于model和entity
    由VS自动生成的.Edmx中,已经将数据库中的关系和结构很完美的体现在实体类entity中
    然而在所接触的实际项目开发中,又区分了model和entity(我们习惯将由VS自动生成的实体称之为entity,而针对业务逻辑和页面展现建立的实体,我们习惯称之为model)。
    所以,在项目开发中,很多工作量可能就投入在业务model 的创建与两个实体数据的转换上了!

    我不知道这种架构是否合理,我不知道微软的初衷是怎样?只存在一个entity,还是将业务model与数据entity区分开来?

    如果只存在一个实体,很显然会减少很多花费在业务model上面的工作量,但是会不会遇到其他问题呢?

    例如,我想更改这个实体,给每个属性都加上验证Attribute,那么这个实体从此就只能手动维护了,如果数据结构再次发生更新,那么就不能通过VS工具自动生成了(更新后,会将手动改过的部分覆盖掉)。如果数据结构更新频率太高,这样就会更麻烦!

    这个问题困扰我好久,不到到底如何去解决!微软的初衷又是什么样子的,求解……

    2013年10月14日 7:13

答案

  • MVC 默认传入的 Model 类型是VS 内建的功能,在简单的页面应用的时候当然没有问题,但是在一个大型的复杂关系的项目中,这么做就不太好。

    正确的做法就是创建一个空的 View,在 View 文件的最上部声明该 View 使用什么类型的 Model.

    @model Portal.Models.OverviewModel
    @{
        
        // Other things
        var style = Model.Style == Contract.Enumerations.OverViewTypes.Summary ? 1 : 0;
    }
    
    <input type="hidden" id="__style" value="@style"/>
    
    <div>
        <div id="overMaskZone">
            <div class="center">
                // Render partial view with special view model
                @{ Html.RenderPartial("_OverviewCurrent", Model);}
            </div>
    
            <div class="center">
                @{ Html.RenderPartial("_OverviewStatics", Model);}
            </div>
        </div>
        <div class="center">
            @{ Html.RenderPartial("_OverviewControl", Model);}
        </div>
        <div class="clear"></div>
    </div>
    


    Please mark this as answer if it helps with this issue!

    2013年10月18日 5:26

全部回复

  • 微软的初衷应该是只存在一个entity, 后来的model应是业务的需求后期加上去的, 一个考虑应该就是为了数据的安全, 有的业务可能不想让其他人知道所有的数据,所以利用modePOCO来重新展示数据.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年10月15日 3:01
    版主
  • 微软的初衷应该是只存在一个entity, 后来的model应是业务的需求后期加上去的, 一个考虑应该就是为了数据的安全, 有的业务可能不想让其他人知道所有的数据,所以利用modePOCO来重新展示数据.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    我所接触的,基本上都是存在两个实体,其实我也想,只要一个实体,会省事很多!
    2013年10月16日 6:53
  • Hi,

    Entity Frame Work的主要工作就是实现 ORM 和便捷的数据访问层,简而言之就是 EF 所用到的Model就是你数据库表在程序中的一种表现,操作这些 EF Model 就等于是在操作数据库表了。

    而你所说的 Model 应该是为了满足你的实际业务需求所创建的 Logic Model 或是 ViewModel, 这些 Model 只对你的业务或是页面有意义,你在需要对数据库做操作的时候 还是要把这些Logic Model 或是 ViewModel 分解或是整合成一个 EF Model.

    这种开发方式能让你的数据库更简单、直接、高效( EF CodeFirst 开发模式中会非常便捷),而且可以实现最大程度的松耦合。


    Please mark this as answer if it helps with this issue!

    2013年10月18日 2:23
  • Hi,

    Entity Frame Work的主要工作就是实现 ORM 和便捷的数据访问层,简而言之就是 EF 所用到的Model就是你数据库表在程序中的一种表现,操作这些 EF Model 就等于是在操作数据库表了。

    而你所说的 Model 应该是为了满足你的实际业务需求所创建的 Logic Model 或是 ViewModel, 这些 Model 只对你的业务或是页面有意义,你在需要对数据库做操作的时候 还是要把这些Logic Model 或是 ViewModel 分解或是整合成一个 EF Model.

    这种开发方式能让你的数据库更简单、直接、高效( EF CodeFirst 开发模式中会非常便捷),而且可以实现最大程度的松耦合。


    Please mark this as answer if it helps with this issue!

    对的,我所用到的就是这样子的。我想问的是,不分开岂不是更省事儿,只要数据表关系设置好了,直接拿EF model当ViewModel用,有何不可。分开了,很多重复的工作量浪费在这两个Model的交互上了!

    而且现在的MVC4.0版本,传给VIew的model值,都是默认给的EF model的,如果所给的model不是EF Model,就添加不成功,除非你添加一个空的控制器


    2013年10月18日 5:04
  • 如果照你所说所有的页面的 Model 都取自 EF,那之后项目要再添加新需求、新页面的时候怎么弄?难道再添加新的 Model? 这么做的结果就是数据库表是不断在变更的,对于后续的功能扩展很不利。

    Please mark this as answer if it helps with this issue!

    2013年10月18日 5:15
  • MVC 默认传入的 Model 类型是VS 内建的功能,在简单的页面应用的时候当然没有问题,但是在一个大型的复杂关系的项目中,这么做就不太好。

    正确的做法就是创建一个空的 View,在 View 文件的最上部声明该 View 使用什么类型的 Model.

    @model Portal.Models.OverviewModel
    @{
        
        // Other things
        var style = Model.Style == Contract.Enumerations.OverViewTypes.Summary ? 1 : 0;
    }
    
    <input type="hidden" id="__style" value="@style"/>
    
    <div>
        <div id="overMaskZone">
            <div class="center">
                // Render partial view with special view model
                @{ Html.RenderPartial("_OverviewCurrent", Model);}
            </div>
    
            <div class="center">
                @{ Html.RenderPartial("_OverviewStatics", Model);}
            </div>
        </div>
        <div class="center">
            @{ Html.RenderPartial("_OverviewControl", Model);}
        </div>
        <div class="clear"></div>
    </div>
    


    Please mark this as answer if it helps with this issue!

    2013年10月18日 5:26