2017-04-10 35 views
0

实体框架6 - 代码优先。 我们有一段时间在我们的数据库上有他们的表的现有类。这些表格已包含我们无法删除的数据。现有表上的EF One to Zero或One关系导致数据库更新出错

我们尝试添加“一到零或一”它们之间的关系如下:

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命令,我们得到这个错误:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Users_dbo.Sessions_Id". The conflict occurred in database "SVC_AAA", table "dbo.Sessions", column 'Id'.

+0

如果你有一个到零或一个关系,它不适用于外键... –

+0

@AntoinePelletier然后我应该怎么做? – Jacob

+0

你不能在两端都有'ForeignKey'属性,我猜''Session'在你的情况下是可选的,所以从'User' PK中去掉FK属性。 –

回答

1

我觉得你过于复杂的CLAS这两个Id上的[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性也可能导致问题。它应该只能在用户标识上,但如果遵循Code-First密钥约定,则根本不需要它。

下面的代码,无需额外DataAnnotations的伟大工程:

public class Student 
{ 
    public Student() { } 

    public int StudentId { get; set; } 
    public string StudentName { get; set; } 

    public virtual StudentAddress Address { get; set; } 

} 

public class StudentAddress 
{ 
    [ForeignKey("Student")] 
    public int StudentAddressId { get; set; } 

    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public int Zipcode { get; set; } 
    public string State { get; set; } 
    public string Country { get; set; } 

    public virtual Student Student { get; set; } 
} 

你可以找到很多使用实例创建的代码首先关系:http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

更新:

对于更复杂类,请尝试以下操作:

public class Session 
{ 
    [Key] 
    [ForeignKey("User")] 
    public long Id { get; set; } 
    ... 
    public virtual User User { get; set;} 
} 

public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 
    ... 
    public virtual Session Session { get; set;} 
} 
+0

这是经典,基本的模型定义。由于它非常简单,它确实有效。 EF可以从简单模型预测规则并相应地生成数据库。例如:它将自动定义Student.StudentId作为主键&非空&身份,而不必明确宣布它。当事情变得更加复杂,模型类需要更多的关系并包含更多的数据(如现实世界),我们必须明确地告诉EF规则和关系。 – Jacob

+0

然而,正如我写的,我试图用这种风格来定义它,但在创建迁移时遇到了一个错误,我必须通过映射或数据注释明确定义这种关系。但是,谢谢你。 – Jacob

+0

以这种方式定义它时会得到什么错误?是同一个错误还是不同的? –

相关问题