【发布时间】:2017-04-10 14:21:10
【问题描述】:
实体框架 6 - 代码优先。 我们的数据库中有一段时间的现有类及其表。这些表已经包含我们无法删除的数据。
我们尝试在它们之间添加“一到零或一”的关系,如下所示:
public class Session
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("User")]
public long Id { get; set; }
...
public virtual User User { get; set;}
}
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[ForeignKey("Session")]
public long Id { get; set; }
...
public virtual Session Session { get; set;}
}
这是它根据上述更改创建的迁移:
public partial class AddingSessionAndDialogOneToOneRelation : DbMigration
{
public override void Up()
{
CreateIndex("dbo.Users", "Id");
AddForeignKey("dbo.Users", "Id", "dbo.Sessions", "Id");
}
public override void Down()
{
DropForeignKey("dbo.Users", "Id", "dbo.Sessions");
DropIndex("dbo.Users", new[] { "Id" });
}
}
但是当我们运行 Update-Database 命令时,我们得到这个错误:
ALTER TABLE 语句与 FOREIGN KEY 约束“FK_dbo.Users_dbo.Sessions_Id”冲突。冲突发生在数据库“SVC_AAA”、表“dbo.Sessions”、列“Id”中。
【问题讨论】:
-
如果你有一对零或一对一的关系,它不适用于外键......
-
@AntoinePelletier 那我该怎么办?
-
你不能在两端都有
ForeignKey属性,我猜Session在你的情况下是可选的,所以从你的UserPK中删除FK属性。 -
@FlorianHaider 我试过了。它会生成相同的迁移和相同的错误。
-
完全不要使用外键,想象一下你的外键没有创建它,只是一个没有约束的字段,就是代表另一个表的id的int
标签: c# entity-framework ef-code-first