实体框架代码第一个用于标识列的私有集

Posted

技术标签:

【中文标题】实体框架代码第一个用于标识列的私有集【英文标题】:entity framework code first private set for identity column 【发布时间】:2016-10-02 16:43:16 【问题描述】:

在我看来,几乎默认情况下,所有代码优先的 POCO 都应该为它们的主键(也就是自动生成的 Id)提供私有设置器。

像这样 - 公共 int id 获取;私人套装;

这是一个错误的假设吗?我不希望我的 API 允许设置自动生成的列。

【问题讨论】:

这只是一个意见,只有其他意见才能回答。不适合 Stack Overflow。 这不是意见,而是 EF 代码第一脚手架的一部分。正如您在下面我的评论中看到的那样,这已经在我们的代码库中造成了一个问题,其中自动生成的 ID 现在由代码更新,而不是在数据库中。 你的问题,如上所述,只是一种观点(顺便说一句,我很容易同意)。这不是一个特定的编程问题,而是属于 SO 的那种问题。 【参考方案1】:

公开一个公共设置器应该不是问题,因为甚至不建议在数据访问对象层之外公开这个 POCO。

公开使用特定框架属性装饰的 POCO,甚至公开某种存储信息(在本例中为实体关系数据库)的 POCO 都是不好的做法。

考虑将其包装在一个接口中并将其作为该接口的实例返回。这样您就可以享受两全其美的体验。公开必要的属性并只允许设置其中的一部分。

无论如何,我认为 EF 不会太喜欢私有 setter 的东西。

【讨论】:

有趣的是,我担心的东西已经潜入我们的代码中。这是在组织实体的 POST 中。这里的 id 是数据库中的一个身份 - organization.id = db.Organizations.Count() > 0 ? db.Organizations.Max(x => x.id) + 1 : 0;

以上是关于实体框架代码第一个用于标识列的私有集的主要内容,如果未能解决你的问题,请参考以下文章

如何强制实体框架插入标识列?

实体框架抛出无法在表中插入标识列的显式值...当 IDENTITY_INSERT 设置为 OFF 错误

ADO.NET Entity Framework 和标识列

无法首先在表 ef6 db 中插入标识列的显式值

sql 用于将列更改为作为主键的标识列的SQL代码。您必须删除密钥,删除列,将列添加回i

从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列