【发布时间】:2015-09-06 14:22:57
【问题描述】:
我有一个类似于以下的代码优先模型:
public class TestContext : DbContext
{
public DbSet<Class1> Class1s { get; set; }
public DbSet<Class2> Class2s { get; set; }
}
public class Class1
{
public int Class1Id { get; set; }
}
public class Class2
{
public int Class2Id { get; set; }
public int Class1Id { get; set; }
public Class1 Class1 { get; set; }
}
有零到多个 Class2 对象引用每个 Class1 对象。每个 Class2 对象都必须引用 Class1 对象。
我想做的是有一个从 Class1 到 Class2 的可选引用(以跟踪与 Class1 对象关联的 Class2 对象之一),所以我添加了两个属性:
public class Class1
{
public int Class1Id { get; set; }
public int? Class2Id { get; set; }
public Class2 Class2 { get; set; }
}
现在我在运行 Add-Migration 时收到以下错误:
无法确定之间关联的主体端 类型“ConsoleApplication15.Class2”和“ConsoleApplication15.Class1”。 此关联的主体端必须显式配置 使用关系流式 API 或数据注释。
其他 StackOverflow 答案表明解决方案是在依赖项上指定外键字段:
public class Class2
{
[Key, ForeignKey("Class1")]
public int Class2Id { get; set; }
public int Class1Id { get; set; }
public Class1 Class1 { get; set; }
}
我的添加迁移命令现在完成了,但是迁移创建如下:
public override void Up()
{
DropForeignKey("dbo.Class2", "Class1Id", "dbo.Class1");
DropIndex("dbo.Class2", new[] { "Class1Id" });
DropColumn("dbo.Class2", "Class2Id");
RenameColumn(table: "dbo.Class2", name: "Class1Id", newName: "Class2Id");
DropPrimaryKey("dbo.Class2");
AddColumn("dbo.Class1", "Class2Id", c => c.Int());
AlterColumn("dbo.Class2", "Class2Id", c => c.Int(nullable: false));
AddPrimaryKey("dbo.Class2", "Class2Id");
CreateIndex("dbo.Class2", "Class2Id");
AddForeignKey("dbo.Class2", "Class2Id", "dbo.Class1", "Class1Id");
}
这看起来不像我想要的。它正在删除 Class2 上的主键,它在最后添加的外键完全错误。
如何向 EF 描述我的要求,以便它生成正确的模型?
【问题讨论】:
标签: entity-framework ef-code-first foreign-keys entity-framework-6 foreign-key-relationship