添加所需的外键

时间:2016-03-21 07:42:37

标签: sql-server entity-framework

我有一张“学生”表。我想补充一点,学生们的行李包含物品:

Students:
| Id | Name   | BagId |
|----|--------|-------|
|  0 |  Josh  |    0  |
|  1 |  Emma  |    2  |

Bags:
| Id |
|----|
|  0 |
|  1 |
|  2 |

Items: 
| BagId | Item    |
|-------|---------|
|     0 | Banana  |
|     0 | Apple   |
|     1 | Pen     |
|     1 | Tissue  |
|     2 | Gun     |

我需要“手袋”表和BagId,因为我希望除了学生之外的其他实体能够拥有一个包(但如果你有更好的主意,我会全力以赴)。

我的问题:

  • 我还没有Students.BagId专栏
  • 我希望它是一个非空的外键
  • 我已经有很多学生
  • 未填充包表

=>如何在创建Student.BagId列和应用外键约束之间填充Bags表并为每个学生提供BagId? (我不需要填充Items表,所有行李最初都是空的)

我尝试过像

这样的事情
UPDATE Students
SET BagId = t.Id
FROM (
  INSERT INTO Bags DEFAULT VALUES
  OUTPUT INSERTED) as t

没有成功。

我正在使用Entity Framework 6,我想在迁移过程中完成所有这些工作。

1 个答案:

答案 0 :(得分:1)

假设bag表中还没有数据,你可以编写一个自定义的sql脚本,你可以按照

的方式做一些事情。
DECLARE @Temp TABLE(
StudentId INT,
BagId INT IDENTITY(1,1))

INSERT INTO @Temp(
    StudentId
)(
    Select Id
    from Students
)
SET IDENTITY_INSERT Bags ON
INSERT INTO Bags(
   Id
 )(
    Select BagId 
    From @Temp
 )
 SET IDENTITY_INSERT Bags OFF

 UPDATE Students
    Set BagId = T.BagId
 FROM Students S
 INNER JOIN @Temp T on T.StudentId = S.Id

 --just to show results
 Select * from Students
 Select * from Bags