我们目前正在重写现有的内部ASP.NET Web窗体应用程序。我们的应用程序包括一个使用Entity Framework 6进行数据访问的Web Api后端和一个使用AngularJS的前端。
我们有一个现有的大型数据库,我使用Code-First使用现有数据库方法创建了EF模型,我们使用数据传输对象类作为API方法的输入/输出,所以我们不是直接暴露我们的模型类。所以基本上,我试图同时熟练掌握EF,Web Api和AngularJS。在大多数情况下,我对后两者相当满意,但对于EF我还没有完全熟悉。我已经在微软虚拟学院观看了很多视频,但这是我第一次有一些实际操作经验。
我们已经在这个应用程序上工作了几个月,到目前为止我们只需要在我们的实体(POCO DTO&#)上进行CRUD操作,这些实体是具有简单属性的扁平对象。但是,我们终于遇到了一些情况,我们不仅需要处理我们的类,还需要处理类本身的属性;亲子关系。
因此,我有以下问题:
我看到当我们在数据库中有一个正确的外键关系时,那些虚拟属性是在EF中创建的,我记得它是为了支持延迟加载。但是,在我们使用Web服务(Web Api)的环境中,延迟加载并不可行。我们的对象模型确实允许一些非常大的类层次结构,其中完全填充的对象及其子代表意味着在没有必要的情况下传递大量数据,因此在大多数情况下,第一级对象是我们所需要的。但是,在某些情况下,我们确实希望填充子类,所以我的问题是我们如何做到这一点,我们在哪里做?我已经查看了DB Context中自动生成的代码,但我们还使用了scaffolded代码来创建控制器。我们需要在哪个地方这样做?我已经看到代码示例显示了如何做到这一点,但它没有具体说明这段代码所在的位置。它似乎在控制器内,但我可能是错的。
如果我们允许2级或更多级别的对象,EF会自动处理操作(更新,删除等) - 例如,如果我们有"公司"具有"客户"的集合的对象对象,我们删除"公司"对象,做相关的"客户"对象也被删除了吗?此外,是一个多步操作,如在事务中自动执行,还是我们需要明确设置它?
如果我修改模型类或数据库上下文,看到这个代码是自动生成的,那通常是不好的做法,因为我的更改可能会被覆盖,所以我假设控制器代码在哪里我想做出改变。我知道数据库迁移,但我没有使用它们的经验,我确信我需要在某些时候使用它们,因为我相信我们的数据库可能没有EF所需的所有外键关系我们目前需要的一切。
我知道这是一个很长的帖子,但是如果有人可以就如何做这些事情提供一些指导,因为不仅我不得不处理这个问题,而且还有另外两个我的团队中正在开展这个项目的开发人员和我们一样,对其他人都缺乏经验。感谢
答案 0 :(得分:0)
为了通过Web服务发送数据,我建议创建一个DTO来保存您要发送的数据并将您的实体映射到DTO,而不是尝试在您的有效负载中发送实体本身。它还可以保护您的API不受实体更改的影响。
级联删除是可配置的,iirc,但我不能100%确定默认值是什么。事务通常不是隐式的,因此您需要使用需要它们的那些事务。
不完全确定你在这里问的是什么。通常,实体/表的更改方式取决于您使用的是数据库优先还是代码优先。如果您使用的是数据库优先(在解决方案中将有一个与您的模式匹配的模型的.edmx文件),您只需直接更新SQL并通过.edmx更新您的实体模型。如果使用代码优先,则将更改实体的方式,并运行数据库迁移以更新数据库以进行匹配。
关于代码优先迁移的MSDN文章:https://msdn.microsoft.com/en-us/data/jj591621.aspx