3

これは本当に明白なことかもしれませんが、なぜ私の InverseProperty 注釈が他の方法で機能しないのかわかりません。

私はこの2つのクラスを持っています(簡略化):

public class Cluster
{
    [Key]
    public int ClusterId { get; set; }

    [Required]
    [MaxLength(80, ErrorMessage = "DimensionCluster Name cannot be more than 80 characters in length.")]
    [Display(Name = "DimensionCluster Name")]
    public string ClusterName { get; set; }

    [InverseProperty("DimensionCluster")]
    public virtual IEnumerable<Dimension> Dimensions { get; set; }

}

public class Dimension
{
    [Key]
    public int DimensionId { get; set; }

    [Required]
    [MaxLength(80, ErrorMessage = "Dimension Name cannot be more than 80 characters in length.")]
    [Display(Name = "Dimension Name")]
    public string DimensionName { get; set; }

    [Required]
    [Display(Name = "Short Definition")]
    public string ShortDefinition { get; set; }

    [Required]
    [Display(Name = "DimensionCluster Name")]
    public int ClusterId { get; set; }

    [ForeignKey("ClusterId")]
    public virtual Cluster DimensionCluster { get; set; }


}

上記の InverseProperty アノテーションは機能しません。私は得る:

タイプ 'PDguide.Models.Cluster' のプロパティ 'Dimensions' の InversePropertyAttribute が無効です。プロパティ 'DimensionCluster' は、関連するタイプ 'System.Collections.Generic.IEnumerable`1[PDguide.Models.Dimension]' の有効なナビゲーション プロパティではありません。プロパティが存在し、有効な参照またはコレクション ナビゲーション プロパティであることを確認してください。

多くのMSDNドキュメントとSOの回答を試しました。そして、最終的に別の方法(以下のコード)を試してみましたが、うまくいきました!

public class Cluster
{
    [Key]
    public int ClusterId { get; set; }

    [Required]
    [MaxLength(80, ErrorMessage = "DimensionCluster Name cannot be more than 80 characters in length.")]
    [Display(Name = "DimensionCluster Name")]
    public string ClusterName { get; set; }

    public virtual IEnumerable<Dimension> Dimensions { get; set; }

}

public class Dimension
{
    [Key]
    public int DimensionId { get; set; }

    [Required]
    [MaxLength(80, ErrorMessage = "Dimension Name cannot be more than 80 characters in length.")]
    [Display(Name = "Dimension Name")]
    public string DimensionName { get; set; }

    [Required]
    [Display(Name = "Short Definition")]
    public string ShortDefinition { get; set; }

    [Required]
    [Display(Name = "DimensionCluster Name")]
    public int ClusterId { get; set; }

    [ForeignKey("ClusterId")]
    [InverseProperty("Dimensions")]
    public virtual Cluster DimensionCluster { get; set; }

}

関係の両端に InverserProperty 注釈を指定できることをどこかで読みました (その参照が今は見つからないか、間違って推測した可能性があります)。しかし、それはここでは当てはまらないようですか?

InverseProperty はどちらのプロパティでも動作するはずであるという私の理解は正しいですか?

4

1 に答える 1

4

あなたが正しいです。Programming Entity Framework: Code First by Lerman and Millerでは 、72 ページに記載されています。

注釈は、関係のいずれかの端 (または必要に応じて両方の端) に配置できます。

現在の EF ソースを見ると、型のコレクション プロパティのみICollection<T>が有効な逆プロパティとして認識されているようです。したがって、Dimensionsプロパティのタイプをに変更するICollection<Dimension>と、そこにも配置できると思いますInversePropertyAttribute

于 2013-09-05T12:16:24.620 に答える