是否可以使用代码优先在 Entity Framework 6 中动态构建实体?
是否也可以在运行时向这些实体添加属性?
这些实体可以使用外键相互引用吗?
如果有人能指出我正确的方向(如果可能的话),我真的很感激。
编辑
我更改了标题以反射(reflect)更多我想要的内容,这样您就可以明白我为什么问这些问题。
基本上我想创建一个系统,用户可以在其中定义他们想要的对象(表),以及该对象的属性(表中的列)以及对每个对象的引用(表之间的关系)。
现在每个对象都有一个 Id 属性/列。我正在考虑在类似 eav 的表结构中处理这些定义,但我还有在设计时定义的其他对象,并且我喜欢对这些对象使用 linq 查询。我还希望能够在这些对象上构建 linq 查询,因为用户希望报告这些数据。构建 linq 查询应该没问题,因为可以使用动态 linq(也许)?
目前,为了创建这样一个系统,我创建了一个表,其中包含许多文本字段、许多数字字段、许多关系字段,用户可以使用他们想要的字段。但这只是一张表,我认为这最终会在底部咬我,这就是为什么我想将它提升到一个新的水平并为每个对象构建单独的表。
如果有人知道更好的方法或者可能经历过类似的事情,很高兴听到意见。
最佳答案
从 ef4 开始我就对这个主题感兴趣。 拥有一个可以使用它的现实世界解决方案。 我不...
Rowan Miller 是 EF 开发人员之一。他写了一篇关于这个主题的博客。 Dynamic Model creation Blog解释你可以如何做到这一点。
github 示例 buybackoff/Ractor.CLR see OnCreating 展示如何实现。
看起来不错,但是有许多实际限制,使得 使用生成代码或手动代码重新编译更实用。
这也是我没有对其他人投反对票的原因。 :-)
看着有人用茶匙挖自己的坟墓会很有趣吗?
考虑运行时的影响。
这些方法仍然依赖于 POCO 类型发现。 可以从运行中的代码生成程序集。 然后是SO POCO and runtime
在上下文创建期间,初始化程序运行。你调整模型。 然后,自动迁移会添加新闻属性和表。 所以在那段时间里没有其他上下文可以被实例化。 自动迁移期间只能进行非 EF 访问。 所以你仍然有一个逻辑中断。
- 您现在在未知的表中使用以前未知的 pocos。 您使用什么存储库模式...
例如我使用了这种类型的模式....
private IRepositoryBase<TPoco> InstantiateRepository(BaseDbContext context, Type repType, params Type[] args) {
Type repGenericType = repType.MakeGenericType(args);
object repInstance = Activator.CreateInstance(repGenericType, context);
return (IRepositoryBase<TPoco>)repInstance;
}
并在对工厂进行动态调用后将其转换到 IRepository 上。 但我无法避免动态调用。棘手的情况。
祝你好运......
编辑/思考后 我读过a blog about ef 7 Rowan 有一些关于可能不需要 CLR 类型的非常有趣的评论。这使得动态游戏变得更加容易。 如果勇敢的话,你可以尝试 ef7 beta。
关于c# - 允许用户使用 Entity Framework 在运行时定义表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870709/