我正在创建一个应用程序,用于将数据从一个数据库传输到另一个数据库以用于新应用程序,并且我遇到了一个问题,即访问旧数据库中的一些数据。旧数据库是使用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
但是同一个question_id和question_version可能有多个answer_id和answer_version记录,或者answer_id和answer_version都是null,所以我不能使用它。此密钥的任何子集都不允许我正确检索所有数据。另外,我不能使用created_at或updated_at列,因为有多个行使用相同的时间戳写入。
我只需要读取数据,而不是写入,因为它正在转换为新数据库,我无法更改现有数据库。关键问题有什么方法吗?
答案 0 :(得分:2)
在我回答之前,我想指出这个解决方案仅适用于只读情况,如果你需要写表,它将无济于事。在这种情况下,我会指向this answer,在那里你会找到一些帮助。
我设法找到了解决这个问题的方法,虽然很容易使用,但我认为不是最佳选择。
为了解决关键问题,我选择了一个至少不会通过空检查失败的主键,在本例中只是evaluate_id和person_id列。这让我构建没有任何错误,但我仍然无法正确检索所有数据。
解决方法是在数据库上使用SqlQuery。
var responses = context.Database.SqlQuery<Response>("SELECT * FROM dbo.responses");
这在整个数据库上执行查询,并将结果集转换为具有正确数据的响应列表。确保您对数据库而不是表执行查询,否则将使用设计器中指定的错误密钥,您将无法获得正确的数据。
答案 1 :(得分:1)
将SQL放入存储过程并从应用程序中调用它。
如果无法修改源数据库,则可以将存储过程放在目标中。