繁体   English   中英

没有主键就无法访问实体框架表

[英]Can't access Entity Framework table with no primary key

我正在创建一个应用程序,以将数据从一个数据库转移到新应用程序的另一个数据库中,并且遇到访问旧数据库中某些数据的问题。 旧数据库是使用Ruby on Rails创建的,它们是通过Rails设计和创建的,SQL Server中的数据库没有主键,并且所有列都可以为空。 新数据库是在SQL Server中设计和构建的,具有正确的键和可为空的列。 由于两个数据库都在SQL Server中,因此我想使用Entity Framework Database First来简化数据转换。

在EF Desginer中,我能够将实体键分配给所有表,除了一个(响应),这使我无法正确访问表中的数据。 表定义如下:

assess_id [int] NULL
person_id [int] NULL
question_id [int] NULL
question_version [int] NULL
answer_id [int] NULL
answer_version [int] NULL
text [nvarchar(4000)] NULL
created_at [datetime] NOT NULL
updated_at [datetime] NOT NULL

由于允许的记录,主键应包含

assess_id
person_id
question_id
question_version
answer_id
answer_version

但可能有多个answer_id和answer_version记录指向同一个question_id和question_version,或者answer_id和answer_version为空,所以我不能使用它。 此键的任何子集都不允许我正确检索所有数据。 我也不能使用created_at或updated_at列,因为有多个行实例被写入同一时间戳。

我只需要读取数据,而无需写入数据,因为它已被转换为新数据库,并且没有办法更改现有数据库。 有什么办法可以解决关键问题?

在回答之前,我想指出一下,该解决方案仅适用于只读情况,如果您需要写入表,则无济于事。 在这种情况下,我将向您指出此答案 ,您将在其中找到一些帮助。


在这种情况下,我设法找到了解决方法,并且虽然易于使用,但我认为它不是最佳的。

为了解决密钥问题,我选择了一个主键,该主键至少不会使null检查失败,在这种情况下,仅是评估_id和person_id列。 这使我可以进行构建而没有任何错误,但是我仍然无法正确检索所有数据。

解决方法是在数据库上使用SqlQuery。

var responses = context.Database.SqlQuery<Response>("SELECT * FROM dbo.responses");

这将对整个数据库执行查询,并将结果集转换为具有正确数据的响应列表。 确保在数据库而不是表上执行查询,否则将使用设计器中指定的不正确键,并且不会获得正确的数据。

将您的SQL放入存储过程中,然后从您的应用程序中调用它。

如果无法修改源数据库,则可以将存储过程放在目标中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM