我有一些观点,我想使用EF 4.1进行查询。这些是特定的优化视图,无法提及;没有删除,更新,只是很好的选择。
但EF希望在模型上设置一个关键字。有没有办法让EF继续前进,没有什么可担心的?
更多详情
这样做的主要目的是查询已按大小,查询参数和连接进行优化的一组视图。基础表有PK,FK等。它是索引的,statiscized(一个单词?)和优化。
我想要一个类似的课程(这是我所拥有的更小更简单的版本......):
public MyObject //this is a view
{
Name{get;set}
Age{get;set;}
TotalPimples{get;set;}
}
和一个基于EF 4.1 CF的存储库,我可以
public List<MyObject> GetPimply(int numberOfPimples)
{
return db.MyObjects.Where(d=> d.TotalPimples > numberOfPimples).ToList();
}
我可以暴露一把钥匙,但最终是否有一个2或3列自然键的真正目的?那将永远不会被使用?
当前解决方案
看起来他们不会使用EF CF解决方案,我在模型中添加了一个复杂的密钥,我将其暴露在模型中。虽然这与人们期望“设计良好”的数据库模型看起来像“毋庸置疑”,在这种情况下,恕我直言,它只为模型构建器添加了更多逻辑,线上更多字节,以及额外的属性一类。永远不会使用它们。
答案 0 :(得分:2)
没有办法。 EF需要唯一标识记录 - 实体密钥。这并不意味着您必须公开任何其他列。您可以将所有当前属性(或任何子集)标记为键 - 这正是EDMX在向模型添加数据库视图时的工作方式 - 它遍历列并将所有非可空和非计算列标记为主键
您必须知道一个问题 - EF internally uses identity map并且实体密钥是此映射中的唯一标识(每个实体密钥只能与单个实体实例关联)。这意味着如果您无法选择记录的唯一标识,并且您使用相同的标识(您定义的密钥)加载多个记录,则它们将全部由单个实体实例表示。如果您不打算修改这些记录,请不确定这是否会导致任何问题。
答案 1 :(得分:0)
EF正在寻找一种识别记录的独特方式。我不确定你是否可以强迫它违背其对物体的独特需求。
但是,这是“向我展示如何以我想解决的方式解决问题”的问题,而不是实际解决您的核心业务需求。
如果这是“我不想向用户显示密钥”,则在将数据绑定到表单(web或windows)时不要绑定它。如果这是“我需要共享这些项目,但又不想给它们提供密钥”问题,那么将对象映射或代理到外部域模型中。为解决方案增加一点重量,但允许您仍然使用拖放表面(EF)进行繁重的工作。
问题是什么是推动您创建一堆没有唯一标识符(密钥)的对象的业务需求。
答案 2 :(得分:0)
执行此操作的一种方法是根本不使用视图。
只需将表添加到EF模型中,让EF创建您当前正在手写的SQL。