在现有数据库上更改为共享主键?

时间:2011-10-20 22:14:05

标签: c# .net entity-framework migration ef-code-first

我有一个现有的表结构,如下所示:

AnimalTable
-------------
|Id         |
|Color      |
|Weight     |
|AnimalType |
-------------

CatTable
----------------
|Id            |
|MeowSound     |
|AnimalTableId |
----------------

DogTable
----------------
|Id            |
|BarkSound     |
|AnimalTableId |
----------------

AnimalType是“猫”或“狗”。基本上,它是一个“Table Per Type”结构加上AnimalTable中的附加“AnimalType”鉴别器。这显然是一个人为的例子,但我的项目有类似的设置,已经使用了很长时间。我们开始将一些东西转换为使用EF Code First方法,并且我想使用相同的模式,因此我有一个抽象的Animal类,具体的Cat和{{1类。

从头开始设置这看起来非常简单,但我不确定更改现有表上的主键的最佳方法是使它好像我一直使用EF一样。有没有人这样做,可以提供一些提示/方向?提前谢谢。

2 个答案:

答案 0 :(得分:0)

我最终编写了一个存储过程,该过程基本上删除了IdCatTable中的DogTable列,并将AnimalTableId重命名为Id,并将其设为主键。听起来很容易,但困难的部分是编写一些通常会修复已指向CatTable.IdDogTable.Id的所有外键的内容。

答案 1 :(得分:0)

升级脚本。

将来,您将面临与架构的其他更改相同的决定。在开发中,您可以重构类,让EF为您生成数据库。当您转向生产时,您还需要生成一个升级生产的脚本。

要更改主键,请使用:

EXEC sp_rename 'CatTable.Id', 'AnimalTableId', 'COLUMN';