试图将我们的EF4解决方案转换为EF CTP5,并遇到了问题.
这是模型的相关部分:
相关关系: - 一个县有许多城市 - 一个城市只有一个州
现在,我想执行以下查询: - 获取系统中的所有县,并包括所有城市,以及这些城市的所有州.
在EF4中,我会这样做:
var query = ctx.Counties.Include("Cities.State");
Run Code Online (Sandbox Code Playgroud)
在EF CTP5中,我们有一个强类型的包含,它需要一个Expression<Func<TModel,TProperty>>
.
我可以让县的所有城市都没有问题:
var query = ctx.Counties.Include(x => x.Cities);
Run Code Online (Sandbox Code Playgroud)
但我如何才能获得这些城市的州?
我使用纯POCO,所以County.Cities
是ICollection<City>
,所以我不能这样做:
var query = ctx.Counties.Include(x => x.Cities.State)
Run Code Online (Sandbox Code Playgroud)
因为ICollection<City>
没有一个叫做的属性State
.
这几乎就像我需要使用嵌套的IQueryable.
有任何想法吗?我是否需要回退到这个场景中包含的魔术字符串?
我写了一些关于实体框架的假设,然后是几个问题(所以请纠正我错在哪里).我正在尝试使用EF 4的POCO.
我的假设:
假设这是正确的,这是我的问题:
如果不将所有实体保留在同一个EF图表上,那么如何保持数据完整性,如果没有"客户","订单"就不能存在? 这仅仅是存储库的一个功能,只是为了验证完整性而加载数据,还是我们"尝试/捕获"数据库参照完整性错误?
你不会为每个实体创建一个EF图吗? 例如,我不希望客户的更改和产品的更改一起写入,因为它们彼此无关(将它们放在同一图表上会导致它们一起写入).或者EF图的范围是否包含存储在同一存储介质中的所有类似实体?
将这样的实体分开是一种规范,还是只有一个图表来保存所有实体?我会想到后者,但我的想法越来越好.
我正在开始一个新项目,我正在寻找一个非常好的ORM或非基于SQL的持久层.
对于这个项目,我真的不关心数据是如何持久化的,只要它可以以合理的速度查询和存储,最重要的是简单的查询.
应该无缝地处理并发(前端将在另一个层上,并且将有几个同时用户,但不一定处理相同的数据)并且我必须更少关注数据层(简单查询,自动懒惰)装载等)更好.
我还想不惜一切代价避免使用基于字符串的查询,因此支持LINQ或其他直观且可能强类型查询的工具会获得很大的好处.
最后使用POCO对象是我真正想要做的另一件事
这里是我评估的产品列表以及它们不适合的原因,只是为了让我看不到任何关于使用它们的建议:
我也看过MongoDB和CouchDB,但在这些情况下,相关对象的捕获看起来像是在做正确的事情之前需要进行太多的测试.此外,它们都不提供强类型查询.
提前感谢您的建议!
我想知道有没有办法从数据库中排除一些字段?例如:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string FatherName { get; set; }
public bool IsMale { get; set; }
public bool IsMarried { get; set; }
public string AddressAs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何从数据库中排除AddressAs字段?
有时我想模拟我的类的存储数据而不设置数据库的往返.例如,假设我有以下类:
public class ShoppingCart
{
public List<CartItem> Items {get; set;}
public int UserID { get; set; }
}
public class CartItem
{
public int SkuID { get; set; }
public int Quantity { get; set; }
public double ExtendedCost { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设我ShoppingCart
在内存中构建了一个对象,并希望将其"保存"为XML文档.这有可能通过某种XDocument.CreateFromPOCO(shoppingCart)
方法吗?在另一个方向怎么样:是否有一种ShoppingCart
从XML文档创建对象的内置方法,如new ShoppingCart(xDoc)
?
我正在使用EF 4和POCO开始一个项目.
向客户端发送数据的最佳做法是什么?我应该发送POCO还是应该有DTO?
在将实体(与上下文断开连接)发送到客户端时,我是否应该注意任何问题?
建议的做法是将POCO发送到客户端层吗?
我刚安装了EF4的POCO模板.我的模型中有一个实体,AnnouncementText,并且T4文件似乎正确生成.当我访问自动生成的属性时,尝试访问此新实体会引发以下错误MyObjectContext.AnnouncementTexts
:
InvalidOperationException:无法找到EntityType'MyNamespace.AnnouncementText'的映射和元数据信息.
AnnouncementText
POCO 上的属性似乎与数据库中的列匹配,并且我没有更改任何自动生成的代码.
堆栈跟踪是:
at System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)
at System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName)
at System.Data.Objects.ObjectContext.CreateObjectSet[TEntity](String entitySetName)
at MyNamespace.MyObjectContext.get_AnnouncementTexts() in C:\<snip>\MyObjectContext.Context.cs:line 65
at MyNamespace.Class1.Main() in C:\<snip>\Class1.cs:line 14
Run Code Online (Sandbox Code Playgroud)
如果我.tt
从解决方案中删除文件并在模型上启用代码生成,我可以毫无问题地访问该属性.
这是我的代码,如果可能有帮助:
using (var context = new MyObjectContext())
foreach (var at in context.AnnouncementTexts)
Console.WriteLine(at.Title);
Run Code Online (Sandbox Code Playgroud)
关于可能出错的任何想法?
我遇到了EF4和Proxy Pocos的问题.
我在同一个程序集中有两个具有相同名称的类但名称空间不同:
QuoteModels.CashPayment
OrderModels.CashPayment
Run Code Online (Sandbox Code Playgroud)
这编译很好但在运行时EF抛出以下异常:
指定的架构无效.错误:\ r \n由于多个CLR类型与EDM类型"CashPayment"匹配,因此CLR类型到EDM类型的映射不明确.以前发现CLR类型'QuoteModels.CashPayment',新发现的CLR类型'OrderModels.CashPayment'
是否有一种解决方法可以在具有不同命名空间的同一程序集中使用具有相同名称的类来与Ef4一起使用?
我是否必须给他们不同的名字或将他们移到另一个集会?
我是这个整体设计概念的新手,在过去几周的阅读中,我收集了大量的信息,但它似乎分散且矛盾.条款喜忧参半,我只是很难想到这一点.
我使用的模式是这样的,并假设流程如下:
MVC应用程序
控制器处理来自客户端的给定视图的请求/响应.在控制器操作方法内部,它们联系服务(服务层)并请求对象以构建视图模型,并从视图模型中检索对象.
视图模型
我在视图中使用强类型视图模型.
是视图模型DTO吗?它们应该只包含Name,AddressLine1,Address City等简单属性,还是应该包含复杂属性,多个对象等.
是视图模型中的验证.如果是这样,它将是必需的字段,字段长度等验证.然后验证用户名已经存在,或者您需要与服务层中的其他对象进行交互?
视图模型可以只包含从EF返回的POCO类,还是应该使用AutoMapper?
如果使用AutoMapper和DTO,DTO是POCO类的克隆吗?
您会在控制器,视图模型或下面的服务层中进行映射吗?
服务
对我来说,服务是与存储库联系的对象,用于从EF获取POCO对象.这就是我所有业务逻辑的所在.一旦服务将对象传递回存储库以持久保存到EF,它们就被视为有效对象.它是否正确?
存储库
它们中没有业务逻辑,它们仅用于在服务和EF之间传输对象.它是否正确?我在这里使用通用存储库实现接口.那么你可以扩展通用存储库以满足特殊需求吗?
关于术语的问题
1)业务对象是否等于域对象?域对象应包含多少逻辑?
2)域模型是EF模型吗?我正在使用Model-First方法.
3)依赖注入 - 我应该使用它吗?我理解它是如何工作的,只是没有得到真正的好处.我和Ninject一起玩.
我认为社区将受益于某种包含代码示例的所有最佳实践的wiki.那里有类似的东西吗?很多样本都非常简单,很多微软样本即使在声称时也不使用这种模式.
提前感谢所有拥有并将帮助我的人.
顺便说一句 - 我认为StackOverflow需要一点,"接受答案"复选框旁边的"买我一个啤酒"按钮:)
entity-framework poco repository-pattern service-layer asp.net-mvc-3