项目结构:
1.客户端:Winform,
2.数据访问:EF4.0(从数据库生成模型-懒人必需这样)
3.DTO:直接使用EF实体
4.服务端:WCF 托管在IIS中采用basicHttp帮定(这样可以客户端的代理类就不需要每次人肉释放了)
Winform或asp.net ,MVC中每次一般只操作一条记录或者对多条记录进行相同的操作,这个时候我们知道需要对记录或记录集合进行的是那种CURD.
但是如果直接将获取的记录集合 List<T> 帮定到BindingSource并关联DataGridView(或gridControl),并且使用gridControl提供的CURD功能时,怎么才能知道那些记录需要进行那些CURD操作呢?
解决方案暂时不提, 凭借gridcontrol提供的强大功能,一般的单个数据表CRUD可以直接拖控件完成,要知道在一般的企业项目中有大量的基础数据收集维护功能,尤其当你是一个人在战斗时,能拖个控件就把CURD完成时是多么的有幸福,而且现在是采用标准的三层结构,你可以对服务层做下反向代理以实现负载均衡了。
解决办法
界面如下
EF默认在Context中保存对象的状态,但是当对象通过WCF传输后,我们在两端获取对方传输过来的对象多是Detached状态,而且在客户端典型的用法是直接将List<T>帮定到BindingSrouce上,根本不使用EFContext对象进行跟着。
1.那么解决首先是要在客户端对List<T>的对象进行跟踪 要进行跟踪懒人加吊丝的做法当然不是自己实现EF跟踪接口,而是直接使用EFContext对象, 那客户端EFContext对象直接SaveChanges连数据库怎么办? 参考下面的配置,将EF连接字符串的关键信息全部换成*,这样你就能在WinForm中正常的New出Context对象了
<add name="FireSeatEntities" connectionString="metadata=res://*/FireSeatDB.csdl|res://*/FireSeatDB.ssdl|res://*/FireSeatDB.msl;provider=System.Data.SqlClient;provider connection string="data source=****;initial catalog=****;persist security info=True;user id=****;password=***;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />