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
更新!实际上找到了一个更直接的解决方案来解决这个问题:
Accessibility.ForType(entity)并替换它"Internal"(或"Friend"用于VB)遵循这些步骤后,在装配体外部不应看到EF物品的任何部分,一切都应该"正常工作".
如果您仍然遇到"Value not not null"异常,请参阅本文底部的"gotcha".
这里已经回答了这个问题:c#DbSet - 无法获取内部对象
要点是,如果将entityset/dbset属性设置为internal,则不会由EF自动实例化.但您可以按照该页面上接受的答案中的说明手动实例化它.
另一个需要注意的是:
VS2012中存在一个错误(版本11.0.60610.01更新3是我当前的环境),设计人员无法在底层edmx文件中将项目正确地设置回Public,即使它报告的确如此.
因此,即使将项目设置回公开,重新运行上下文t4并重建您仍将收到该异常.
我发现的唯一解决方法是打开edmx文件并手动编辑,将内部设置恢复为公共状态.
| 归档时间: |
|
| 查看次数: |
3752 次 |
| 最近记录: |