0

EF との 1 対 1 の関係を正しく機能させることができません。ブログ、SO、および msdn ドキュメントを獲得しましたが、何も機能していないようです。

次のような Class と Exam の 2 つのモデルがあります。

[Table("classes")]
public class Class
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(255), Required]
    public string Title { get; set; }

    public virtual Exam Exam { get; set; }
}


[Table("exams")]
public class Exam
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [DisplayFormat(DataFormatString = "{0:h:mm tt}")]
    public DateTime? Time { get; set; }

    public int ClassId { get; set; }
    public virtual Class Class { get; set; }
}

クラスから試験に、試験からクラスにアクセスできるようにしたいのですが、どうやってもエラーが見つかります。

移行を作成/実行しようとすると、次のようになります。

The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

これをコンテキストに追加すると:

protected override void OnModelCreating(DbModelBuilder builder)
{
     builder.Entity<Exam>()
        .HasRequired(e => e.Class)
        .WithOptional(c => c.Exam);
}

次のエラーが表示されます。

System.Data.Entity.Infrastructure.DbUpdateException: Entities in 'BenchContext.Exams' participate in the 'Class_Exam' relationship. 0 related 'Class_Exam_Source' were found. 1 'Class_Exam_Source' is expected. ---> System.Data.UpdateException: Entities in 'BenchContext.Exams' participate in the 'Class_Exam' relationship. 0 related 'Class_Exam_Source' were found. 1 'Class_Exam_Source' is expected.

2つのモデル間の外部キーを正しく行う方法を流暢なAPIに伝える方法がわかりませんが、何も影響を与えないようです。

私は何が欠けていますか?

4

1 に答える 1

1

クラスのClassIdプロパティを介して1対1の関係を構築しようとしています。Examこれは一意である必要ClassIdがあります(=一意の制約)が、一意の制約はEFではまだサポートされていません。

EFが現在実際の1対1の関係をサポートしている唯一の方法は、主キーを共有することです。

[Table("classes")]
public class Class
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(255), Required]
    public string Title { get; set; }

    public virtual Exam Exam { get; set; }
}


[Table("exams")]
public class Exam
{
    [Key, ForeignKey("Class")]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    [DisplayFormat(DataFormatString = "{0:h:mm tt}")]
    public DateTime? Time { get; set; }

    public virtual Class Class { get; set; }
}

IdinExamsテーブルは、PKとFKの両方のClassesテーブルです。自動生成された値を持つことはできません。これは1対1の関係ですが、それでも1〜0..1の多重度があります(Class存在しなくても存在できますが、存在する必要Examがあります)。ExamClass

于 2012-12-19T11:20:57.147 に答える