我正在使用这个使用EF Code First的.net后端应用程序。 Sale
实体具有此TerminalCode
属性,需要将其提升为另一个实体Terminal
,因为我们现在必须跟踪它的属性。
EF部分完成。创建了新实体,它的关系和迁移。
我保留了旧的TerminalCode
属性,因此我可以根据它创建Terminal
条目。我可以创建一个简单的控制台应用程序来迭代Sale.TerminalCode
属性并创建它相应的Terminal
条目,但我宁愿把它作为迁移和T-SQL的一部分。问题是我用T-SQL做得不够好......实际上我甚至都不知道它是否可能。
Sale
实体之前:
Id, RetailerId, TerminalCode, ...
Sale
实体之后:
Id, RetailerId, TerminalId, TerminalCode (temporary) ...
新Terminal
实体:
Id, RetailerId, Code, ...
如果没有一些代码,有人至少能指出我正确的方向吗?
答案 0 :(得分:1)
听起来你有一个具有TerminalCode列的表Sale,并且你想将这些终端代码移动到它们自己的表中并创建一个规范化的外键关系。
这是您开始时的零售商和促销表:
CREATE TABLE Retailer (Id INT CONSTRAINT PK_Retailer PRIMARY KEY)
INSERT INTO Retailer (Id) VALUES (1), (2), (3)
CREATE TABLE Sale (Id INT, RetailerId INT CONSTRAINT FK_Sale_RetailerId FOREIGN KEY REFERENCES Retailer(Id), TerminalCode VARCHAR(100))
INSERT INTO Sale VALUES (1, 1, 'aksjdfh')
INSERT INTO Sale VALUES (2, 1, 'aksjdfh')
INSERT INTO Sale VALUES (3, 2, 'xcvklbj')
INSERT INTO Sale VALUES (4, 2, 'xcvklbj')
INSERT INTO Sale VALUES (5, 2, 'xcvklbj')
INSERT INTO Sale VALUES (6, 3, '892374g')
INSERT INTO Sale VALUES (7, 3, '892374g')
INSERT INTO Sale VALUES (8, 3, '89ysasj')
INSERT INTO Sale VALUES (9, 3, '89ysasj')
INSERT INTO Sale VALUES (10, 3, '89ysasj')
以下是将这些不同的终端代码移动到自己的表中并在终端表与销售和零售商表之间创建外键关系的方法:
CREATE TABLE Terminal (Id INT IDENTITY(1,1) PRIMARY KEY, Code VARCHAR(100), RetailerId INT)
-- If you need a constraint from Terminal to your table of Retailers, create it here, e.g.:
ALTER TABLE Terminal ADD CONSTRAINT FK_Terminal_TerminalId FOREIGN KEY (RetailerId) REFERENCES Retailer(Id)
INSERT INTO Terminal (Code, RetailerId) SELECT TerminalCode, MIN(RetailerId) FROM Sale GROUP BY TerminalCode
ALTER TABLE Sale ADD TerminalId INT CONSTRAINT FK_Sale_TerminalId FOREIGN KEY REFERENCES Terminal(Id)
UPDATE Sale SET TerminalId = Terminal.Id
FROM Sale
INNER JOIN Terminal ON Sale.TerminalCode = Terminal.Code
-- Drop the foreign key constraint from Sale to Retailer if one exists, e.g.:
ALTER TABLE Sale DROP FK_Sale_RetailerID
ALTER TABLE Sale
DROP COLUMN TerminalCode, COLUMN RetailerId
现在您的架构如下所示:
SELECT * FROM Sale
Id TerminalId
1 3
2 3
3 4
4 4
5 4
6 1
7 1
8 2
9 2
10 2
SELECT * FROM Terminal
Id Code RetailerId
1 892374g 3
2 89ysasj 3
3 aksjdfh 1
4 xcvklbj 2