2017-04-10 32 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

以這種方式定義它時會得到什麼錯誤?是同一個錯誤還是不同的? –

相關問題