2017-04-10 10 views
0

Entity Framework 6 - コードファースト。 しばらくの間、データベースにテーブルを持つ既存のクラスがあります。これらのテーブルにはすでに削除できないデータが含まれています。EF 1〜0または1の関係が既存のテーブルでデータベース更新時にエラーになる

我々は次のようにそれらの間の「1にゼロまたは-1」の関係を追加しよう:これは上記の変更に応じて作成された移行である

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から1つの関係がある場合、それは外部キーでは機能しません。 –

+0

@AntoinePelletierどうすればいいですか? – Jacob

+0

あなたは 'ForeignKey'属性を両端に持つことはできません。' Session'はあなたの場合はオプションであると思いますので、 'User' PKからFK属性を削除してください。 –

答えて

1

私はあなたがクラスを複雑にしていると思います両方のIDの[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性も問題を引き起こしている可能性があります。おそらくユーザーIDだけにあるはずですが、Code-Firstキーの規則に従うならば、それはまったく必要ありません。

次のコードは、追加のDataAnnotationsなしで素晴らしい作品:より複雑なため

http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

更新:

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; } 
} 

あなたがでコード最初の関係を作成するための例を使用しての多くを見つけることができますクラスを使用するには、次を試してください:

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をプライマリキーとして定義し、明示的にアナウンスせずに自動的にヌルとIDを指定します。事態がより複雑になり、モデルクラスがより多くの関係を必要とし、より多くのデータを含んでいる場合(実際の世界のように)、EFのルールと関係を明示的に伝える必要があります。 – Jacob

+0

しかし、私が書いたように、私はこのスタイルで定義しようとしましたが、マッピングやデータ注釈を使ってこの関係を明示的に定義しなければならないというマイグレーション作成上のエラーがありました。しかし、ありがとう。 – Jacob

+0

このように定義したときに、どのようなエラーがありましたか?それは同じエラーか別のものでしたか? –

関連する問題