使用Entity Framework创建新数据库时表无效

时间:2015-07-01 14:15:28

标签: c# .net entity-framework entity-framework-6

我有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在表格之后创建约束?

1 个答案:

答案 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==========