添加新实体标量时实体框架 4 映射片段错误

Posted

技术标签:

【中文标题】添加新实体标量时实体框架 4 映射片段错误【英文标题】:Entity Framework 4 mapping fragment error when adding new entity scalar 【发布时间】:2011-03-01 10:23:46 【问题描述】:

我有一个 Entity Framework 4 模型优先设计。我在设计师中创建了我的模型的初稿,一切都很好。我编译、生成数据库等。

后来我尝试将字符串标量 (Nullable = true) 添加到我现有的实体之一,但我在编译时不断收到此类错误:

错误 3004:映射问题 从第 569 行开始的片段:否 为属性指定的映射 设置 MyEntities 中的 MyEntity.MyValue。一个 拥有密钥 (PK) 的实体不会 往返时:实体是类型 [MyEntities.MyEntity]

每当我添加标量时,我都必须手动打开 EDMX 文件并更正 XML。

关于发生了什么的想法?

【问题讨论】:

你到底在纠正什么? 我正在手动编辑实体类型并设置映射。 【参考方案1】:

后来发现,在我的实体上添加/更改/删除属性后,我必须在编译之前“从模型生成数据库”,否则我会收到 3004 映射错误。

【讨论】:

这太荒谬了!我正在从数据库中创建我的模型,而不是相反。我开始发现 EF 有很多问题... :( 我注意到,当我删除属性时,模型的更新版本仍然包含旧字段。我必须手动删除这些字段。添加此信息以防对任何人有所帮助。 我收到了这个错误,似乎数据库与模型不同步。但是我使用的是 Code First,并且不能“从模型生成数据库”。我已将其设置为 DropCreateDatabaseIfModelChanges,由于某种原因它无法使用此附加属性:/ 如果你从数据库开始,不想使用VS从代码生成数据库,而不是“生成”,请尝试“从数据库更新模型...” 是的,我为什么要打扰 EF,linq2sql 从来没有遇到过这类问题【参考方案2】:

我刚刚从模型中删除了有问题的表,然后将它们添加回来,一切都很好。

【讨论】:

也为我工作。数据库优先。 这仍然发生在 EF5 中,这是对我有用的解决方案。在我的例子中,我删除了一个列并向表中添加了一个外键关系(以防它帮助任何人找出原因)。数据库优先。 这似乎是最好的解决方案,而且很容易记住。如果我更改数据库,我将从现在开始删除然后添加。 谢谢,也为我工作。从 edmx 文件中删除了表,从数据库中更新了模型两次(一次用于删除,另一次用于刷新/添加)并且它起作用了。当我首先使用 db 从现有数据库生成模型时发生在我身上,然后将外键约束添加到我的联结表(多对多关系)。一旦我从 edmx 文件中删除了联结表,一切都恢复正常 当我得到这个错误时,我还注意到public <datatype> MyColumnName1 get; set; (注意1)出现在生成的模型中。【参考方案3】:

对于那些从数据库创建模型的人来说,我在对数据库进行更改后遇到了这个问题。当我出于某种原因更改数据库中的字段名称时会发生这种情况(我认为如果您更改数据类型也会发生这种情况)。

对我来说,解决方案是右键单击工作区并选择“从数据库更新模型”。这应该将数据库中的属性添加到您的模型中,但是,它不会删除您的旧属性,并且这些属性会给您 3004 错误。

右键单击工作区并选择“验证”。这应该会给你一个错误列表,显示有问题的属性。然后,您可以右键单击每个有问题的属性并将其从模型中手动删除。

这为我解决了这个问题。希望对其他人有所帮助。

【讨论】:

这应该会给你一个错误列表,显示有问题的属性。然后,您可以右键单击每个有问题的属性并将其从模型中手动删除。 this. “右键单击工作区并选择“验证”” 嗯,我右键单击 VS 从 edmx 文件生成的图表并选择“验证”。我没有看到任何错误。我验证错了吗? 解决了我的问题,我的问题是因为我试图先做一些代码。虽然以前我使用的是 db forst。比失败时我在数据库中添加表并更新模型和问题出现了。我删除了 2 个字段并且它有效(Y) 搞笑这个问题仍然存在。 “验证”提示对我有用 - 必须从我的模型中手动删除一列,因为没有从数据库更新。 我认为从数据库更新永远不会删除东西,它只会添加到您的模型中。【参考方案4】:

如果您想在不重新生成整个模型或从模型重新创建数据库的情况下修改数据库,我发现通过 Visual Studio 修改 EDMX 图中的属性然后手动调整 Visual Studio 没有的映射是最简单和最安全的'不授予访问权限。

错误会给你一个行号:

569

行开始映射片段的问题

只需在文本编辑器中打开 edmx 文件,转到该行,应该很明显需要修复什么。有一个部分如下所示:

<EntityTypeMapping TypeName="YourModel.YourType">
  <MappingFragment StoreEntitySet="YourType">
    <ScalarProperty Name="PropertyName1" ColumnName="DatabaseColumn1" />
    <ScalarProperty Name="PropertyName2" ColumnName="DatabaseColumn2" />
    ...
  </MappingFragment>
</EntityTypeMapping>

只需确保您需要的每个属性/列名称都有一个节点,并且所有属性也都列在 edmx 文档顶部的 &lt;EntityType Name="YourTable"&gt; 部分中

【讨论】:

这是一个很好的电话 - 虽然如果你搞砸了可能会很危险:) 这确实解决了问题,尽管我很惊讶在 edmx 的图形视图中添加一列并不能做到这一点!我希望我能给你更多的分数......【参考方案5】:

如果您所有的查询都是用存储过程编写的,而您只是想填充模型,那么您可以切换到对我有用的复杂类型。

如何创建复杂类型:

    手动更改名称 你是实体生成的类 名字有问题 已在您的 edmx 文件中使用。 选择模型浏览器窗口,然后 右键单击/添加新的复杂类型。 复制/粘贴属性 复杂类型的原始模型。

    将您的存储过程映射到 复杂类型。

    我希望这对某人有所帮助。

【讨论】:

【参考方案6】:

不从图表中删除表格并重新添加它的另一种替代方法是使用表格映射选项。

    转到模型浏览器 右键单击表名。 选择表格映射 Visual Studio 将显示一个窗口,其中 EF 属性匹配/缺少表列。 选择/匹配适当的列与缺少的属性

【讨论】:

【参考方案7】:

重命名我的一个实体的属性后,我遇到了同样的问题。

发现我的实体的属性和表中对应列的映射没有设置。

您可以通过右键单击模型中的实体并选择“表映射”来使用编辑器进行设置。确保属性映射到数据库中的列。

编辑:我还需要重新运行我的 tt 文件来生成新类。 (可能是因为我在另一个项目中拥有它?)

【讨论】:

【参考方案8】:

查看 xml 文件 (edmx) 后,将模型移动到另一个项目并意识到一切正常,我决定关闭并打开 Visual Studio 并再次编译,然后错误消失。

【讨论】:

以上是关于添加新实体标量时实体框架 4 映射片段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

错误 3002:映射片段中的问题 | c# linq 到实体

当我从未将实体添加到上下文时,实体框架错误地保存了它

错误3004:从行开始映射片段时出现问题

核心数据异常:向实体添加新属性后出现 SQLite“没有这样的列”错误

EF 开始的片段时有问题 具有潜在运行时冲突