实体框架中的实体的内部访问使得查询崩溃的简单linq

Rod*_*uez 5 c# linq asp.net-mvc entity-framework internalsvisibleto

我正在开发一个使用EF进行数据库访问的库.为了避免暴露库外的实体,我已将所有表的访问权限设置为内部(我还设置了内部实体容器访问).问题是,现在,在库中,当我尝试通过其id获取实体时,Where查询会抛出异常,我不知道为什么.

内部访问已在图表(.edmx文件)中设置,并且在我作为库中的工厂使用的静态类中,我有类似这样的内容:

var id = 1234;
var mec = new MyEntitiesContainer();
var myEntity = mec.MyEntities.Where(e => e.MyEntitiesId == id).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

在查询中通过其id从数据库获取具体实体(行)的简单方法.

当所有实体类访问都是公共的时,没有问题,但是当我将它们设置为内部时,抛出此异常:

System.ArgumentNullException: Value cannot be null.  Parameter name: source     
    at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
Run Code Online (Sandbox Code Playgroud)

有什么建议?

小智 5

更新!实际上找到了一个更直接的解决方案来解决这个问题:

  1. 在设计器中打开edmx
  2. 将"实体容器访问"设置为"内部"
  3. 确保所有实体都将"Access"设置为Public
  4. 展开edmx并编辑实体t4(不是*.Context.tt)
  5. 在t4搜索Accessibility.ForType(entity)并替换它"Internal"(或"Friend"用于VB)
  6. 保存/重新运行T4就是这样.

遵循这些步骤后,在装配体外部不应看到EF物品的任何部分,一切都应该"正常工作".

如果您仍然遇到"Value not not null"异常,请参阅本文底部的"gotcha".




这里已经回答了这个问题:c#DbSet - 无法获取内部对象

要点是,如果将entityset/dbset属性设置为internal,则不会由EF自动实例化.但您可以按照该页面上接受的答案中的说明手动实例化它.




另一个需要注意的是:

VS2012中存在一个错误(版本11.0.60610.01更新3是我当前的环境),设计人员无法在底层edmx文件中将项目正确地设置回Public,即使它报告的确如此.

因此,即使将项目设置回公开,重新运行上下文t4并重建您仍将收到该异常.

我发现的唯一解决方法是打开edmx文件并手动编辑,将内部设置恢复为公共状态.


spe*_*der 0

来自另一个命名空间的代码如何设置来自您的命名空间的对象中的属性?如果您考虑 EF 如何与您的代码位于不同的命名空间中并填充其中的属性,我敢说这public是有必要的。