2016-04-14 47 views
2

我正在创建一个应用程序,以将数据从一个数据库传输到另一个数据库,以适应新的应用程序,而且我遇到了一个问题,即访问旧数据库中的一些数据。旧数据库是使用Ruby on Rails创建的,它们是通过Rails设计和创建的,SQL Server中的数据库没有主键,所有列都可以为空。新数据库是在SQL Server中设计和构建的,具有适当的键和可空列。由于这两个数据库都在SQL Server中,因此我希望使用实体框架数据库优先进行数据转换。无法访问没有主键的实体框架表

在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列,因为有多个正在使用相同时间戳写入的行的实例。

我只需要读取数据而不是写入数据,因为它正在转换到新的数据库中,并且我无法更改现有的数据库。有没有解决关键问题的方法?

回答

1

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


我设法为这种情况找到解决方法,虽然容易使用,但我不认为它是最优的。

为了解决关键问题,我选择了一个主键,至少不会失败一个空检查,在这种情况下,只是assess_id和person_id列。这让我没有任何错误,但我仍然无法正确检索所有数据。

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

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

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

1

把你的SQL放到存储过程中,并从你的应用程序调用它。

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

+0

我没有能力对现有数据库进行任何修改,我正在尝试读取。 –

+0

@Evan请参阅editted答案。 –