【问题标题】:Entity Framework bug, insert command generation实体框架错误,插入命令生成
【发布时间】:2011-03-09 16:05:45
【问题描述】:

我正在使用 Entity Framework 处理 PostgreSql DB: 当我将新项目添加到数据库中时,它会生成奇怪的代码:

INSERT INTO (SELECT "person_contact"."person_id" AS "person_id",
             "person_contact"."contact_id" AS "contact_id" 
             FROM "public"."person_contact" AS "person_contact")
       ("person_id","contact_id") 
       VALUES (cast(141792 as int8),cast(289406040 as int8))

所以加了

SELECT "person_contact"."person_id" AS "person_id",
"person_contact"."contact_id" AS "contact_id" 
FROM "public"."person_contact" AS "person_contact"

而不是表名“public”。“person_contact”

如何解决这个实体框架错误???

UPD:当我尝试删除“person_contact”条目时出现同样的问题。在删除语句而不是表名中 - 选择查询。

【问题讨论】:

  • EF 不生成 SQL。您的 PostgreSQL 提供程序可以。和写这篇文章的人谈谈。
  • 我正在使用 NPgsql 提供程序。我认为这个问题更多地与 EF 相关而不是提供者,因为它只发生在这张表上。对于另一个表,它可以工作。
  • 我再重复一遍:EF 不生成 SQL。
  • 可能是我没有正确理解 EF 架构,但是按照 MSDN 中的这张图片,EF 构建命令树。基于其形成使用 ADO.NET 数据提供程序的 SQL 代码。但这没关系。我在通过 Npgsql 提供程序和 EF 生成 SQL 代码时遇到问题。
  • 你能把你生成这个 SQL 的代码写下来吗?没有看到这一点,很难理解为什么会生成这些错误的查询......

标签: c# sql entity-framework postgresql


【解决方案1】:

有几种方法可以尝试解决这个问题:

这些是按照我尝试它们的顺序列出的。

【讨论】:

  • 1) 它没有帮助。每当数据库发生任何变化时,模型都会重新创建。
  • 2) 我找不到这张桌子有什么特别之处。 3) Devart dotConnect for PostgreSQL 可以免费使用吗?我找不到可以下载它的链接。不幸的是,我无法登录他们的网站。注册后尝试登录时,任何时候都会抛出 404 错误。
【解决方案2】:

您很可能忘记在此表上创建主键。

我也遇到过同样的问题,我的解决方案非常简单。问题是我有一个名为“id”的列,但我忘记将其设为主键。我将它设置为主键的那一刻一切都很好。

这很奇怪,因为EF,通常不会导入没有主键的表,但是当你有名为“id”的列时,它假定它是主键。

我的表结构是:

*DROP TABLE IF EXISTS "public"."fact_season_tickets";
CREATE TABLE "public"."fact_season_tickets" (
"id" int8 DEFAULT nextval('fact_season_tickets_id_seq'::regclass) NOT NULL,
"season_ticket_id" int8 NOT NULL,
"date_key" int4 NOT NULL,
"station_id" int4 NOT NULL,
"amount" numeric(18,2) DEFAULT 0 NOT NULL,
"status" int4 NOT NULL
)
WITH (OIDS=FALSE)*

NpgSql 生成的 INSERT 语句为:

*INSERT INTO (SELECT "fact_season_tickets"."id",
    "fact_season_tickets"."season_ticket_id",+
    "fact_season_tickets"."date_key", 
    "fact_season_tickets"."station_id", 
    "fact_season_tickets"."amount", 
    "fact_season_tickets"."status" 
FROM "public"."fact_season_tickets" AS "fact_season_tickets") 
("season_ticket_id","date_key","station_id","amount","status") 
VALUES (510::int8,20150630,2,18.00::numeric,1) 
RETURNING "id"*

解决方案只是创建一个主键:

*ALTER TABLE "public"."fact_season_tickets" ADD PRIMARY KEY ("id");*

【讨论】:

  • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
  • 我不明白您所说的“这不能提供问题的答案”是什么意思。就我而言,这就是问题的答案。 Anton 提到的“奇怪代码”是由于缺少主键而产生的。向表中添加主键可以解决问题。它对我有用,我希望它对其他人也有用。
  • 使用配置或代码示例说明您的帖子以获得更好的答案质量。
  • 我正在尝试添加一些代码示例,但是当我尝试提交我的编辑时出现错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多