我有类似如下的代码第一种模式:实体框架代码优先 - 可选/需要双向导航
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; }
}
有零参照各Class1的对象很多的Class2对象。每个Class2对象都必须具有对Class1对象的引用。
我想什么做的是从class1的Class2中的可选引用(跟踪与Class1的对象相关联的Class2中的一个对象),所以我加了两个属性:
public class Class1
{
public int Class1Id { get; set; }
public int? Class2Id { get; set; }
public Class2 Class2 { get; set; }
}
现在我收到以下错误,当我运行添加迁移:
无法确定 类型“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的要求,以便生成正确的模型?
这正是我需要的 - 非常感谢。 –