我有EntityA,EntityA_Child,EntityB和EntityC,它们看起来像这样
public class EntityA {
public long Id { get; set; }
public Collection<EntityB> EntityBCollection { get; set; }
}
public class EntityA_Child {
public long Id { get; set; }
public EntityA EntityA { get; set; }
public EntityC EntityC { get; set; }
}
public class EntityB {
public long Id { get; set; }
public Collection<EntityC> EntityCCollection { get; set; }
}
public class EntityC {
public long Id { get; set; }
}
以前我将EntityA_Child作为普通的复杂对象,但因为我需要引用另一个实体,所以我必须将它作为一个单独的实体,因为复杂的对象不能包含对其他实体的引用。
无论如何,这一切都在我的系统中工作,我正在编写我的单元测试,当它试图创建数据库时它失败了,说
抛出异常。 System.Data.SqlClient.SqlException:System.Data.SqlClient.SqlException:Foreign key&#39; FK_dbo.EntityA_Child_dbo.EntityC_Id&#39;引用无效表格&#39; dbo.EntityC&#39;。
现在我知道这是因为正在使用EntityC的约束创建EntityA表,但由于EntityC尚未创建,我收到错误。
我该如何解决?
我必须能够将EntityC中的记录分配给EntityA。
有没有办法告诉Entity Framework在表格之后创建约束?
答案 0 :(得分:0)
EF在表创建后已经添加了外键约束。
BTW,将长ID改为int Id(因为我的测试提供商而必须这样做)对我有用。所以你的问题是不同的(已经创建了DB?)。 这是EF针对DBMS运行的SQL Creation语句
CREATE TABLE [EntityA_Child] (
[Id] int not null identity(1,1)
, [EntityA_Id] int null
, [EntityC_Id] int null
);
ALTER TABLE [EntityA_Child] ADD CONSTRAINT [PK_EntityA_Child_57aa7524] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE TABLE [EntityAs] (
[Id] int not null identity(1,1)
);
ALTER TABLE [EntityAs] ADD CONSTRAINT [PK_EntityAs_57aa7524] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE TABLE [EntityBs] (
[Id] int not null identity(1,1)
, [EntityA_Id] int null
);
ALTER TABLE [EntityBs] ADD CONSTRAINT [PK_EntityBs_57aa7524] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE TABLE [EntityCs] (
[Id] int not null identity(1,1)
, [EntityB_Id] int null
);
ALTER TABLE [EntityCs] ADD CONSTRAINT [PK_EntityCs_57aa7524] PRIMARY KEY ([Id])
ExecuteNonQuery==========
CREATE INDEX [IX_EntityA_Id] ON [EntityA_Child] ([EntityA_Id])
ExecuteNonQuery==========
CREATE INDEX [IX_EntityC_Id] ON [EntityA_Child] ([EntityC_Id])
ExecuteNonQuery==========
CREATE INDEX [IX_EntityA_Id] ON [EntityBs] ([EntityA_Id])
ExecuteNonQuery==========
CREATE INDEX [IX_EntityB_Id] ON [EntityCs] ([EntityB_Id])
ExecuteNonQuery==========
ALTER TABLE [EntityA_Child] ADD CONSTRAINT [FK_EntityA_Child_EntityAs_EntityA_Id
] FOREIGN KEY ([EntityA_Id]) REFERENCES [EntityAs] ([Id])
ExecuteNonQuery==========
ALTER TABLE [EntityA_Child] ADD CONSTRAINT [FK_EntityA_Child_EntityCs_EntityC_Id
] FOREIGN KEY ([EntityC_Id]) REFERENCES [EntityCs] ([Id])
ExecuteNonQuery==========
ALTER TABLE [EntityBs] ADD CONSTRAINT [FK_EntityBs_EntityAs_EntityA_Id] FOREIGN
KEY ([EntityA_Id]) REFERENCES [EntityAs] ([Id])
ExecuteNonQuery==========
ALTER TABLE [EntityCs] ADD CONSTRAINT [FK_EntityCs_EntityBs_EntityB_Id] FOREIGN
KEY ([EntityB_Id]) REFERENCES [EntityBs] ([Id])
ExecuteNonQuery==========