如何在实体框架中创建只读实体?

Posted

技术标签:

【中文标题】如何在实体框架中创建只读实体?【英文标题】:How to create read-only entity in Entity Framework? 【发布时间】:2011-01-28 13:50:42 【问题描述】:

我的应用程序是纯只读的,因此我不想生成所有更新和删除代码,也不想从所有表中提取所有字段。其中一些字段不可为空,因此我在此处从 EF 收到错误,因为没有要保存的默认值。

在我之前的 ORM (Wilson) 中,您可以在 XML 中将实体标记为只读。我已经看到一些帖子显示了对此的复杂解决方案。我错过了什么吗?为什么不是直截了当?

我看到 RIA 服务向导为每个实体都有一个复选框...

【问题讨论】:

您需要更准确地了解您看到的错误以及您在什么情况下看到它们。没有“只读”功能,但无论如何,您的应用应该仍然可以工作。 从设计器中的实体中删除一些列(数据库中的非空值)后,我收到错误:“表 ABC 中的列 xyz 必须映射:它没有默认值并且是不可为空。”这有点道理,但我想完全忽略该列,根本没有 EF 构建更新代码。 【参考方案1】:

问题是您的 SSDL 中有一个不可为空的字段,而该字段不在您的 CSDL 中。

您可以手动从 SSDL 中删除该列,EF 会很高兴。 但是设计者会在您更新模型时重新添加该列。因此,您可以再次删除它,也可以从没有该列的 DB 变体更新您的模型。

【讨论】:

这就是我的怀疑。但为什么?如果我从 EDMX 中删除它,那么在允许只读属性或从 SSDL 中删除该列有什么困难? 您不能在读写类型上具有只读、不可为空的属性,并且 EF 没有“只读类型”功能,AFAIK。从 SSDL 中删除列并不“难”,但设计人员选择不这样做,因为在 GUI 设计人员的世界中,SSDL总是生成(并且经常重新生成),而不是手动维护。 好的,我可以接受从 SSDL 中删除该列(并继续删除它),但是生成的所有 crud 代码呢 -​​ 知道它在那里,即使在不需要时也很烦人。想知道 EF 没有只读类型属性的问题是什么......

以上是关于如何在实体框架中创建只读实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架中创建多对多映射?

如何在实体框架数据库迁移中创建全文目录? [复制]

如何在 C# 和 WPF 中的实体框架中创建数据库和表?

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?

存储过程无法在实体框架中创建复杂类型