1

構築中のプロジェクトでクラス間の関係を作成する方法がわかりません。

Photoとの 1 対 1 の関係が必須でPhotoExif、 との 1 対 1 の関係PhotoがオプションであるクラスがありますFeaturedPhoto

エラーが発生します:

タイプ の複合主キーの順序を決定できませんWebsite.Models.PhotoExifColumnAttributeまたはメソッドを使用してHasKey、複合主キーの順序を指定します。

助けていただければ幸いです。

Photo.cs

public class Photo
{
    [Key]
    public int PhotoID { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }
    public Orientation Orientation { get; set; }
    public int Rating { get; set; }
    public string URL { get; set; }
    public string Filename { get; set; }
    public DateTime DateAdded { get; set; }
    public bool Hide { get; set; }
    public string MetaDescription { get; set; }
    public string MetaKeywords { get; set; }

    public virtual PhotoExif PhotoExif { get; set; }
} 

PhotoExif.cs

public class PhotoExif
{
    [Key]
    public int PhotoExifID { get; set; }

    public int PhotoID { get; set; }

    public string ShutterSpeed { get; set; }
    public string Aperture { get; set; }
    public string FocalLength { get; set; }
    public int ISO { get; set; }
    public string ExposureBias { get; set; }
    public bool Flash { get; set; }
    public string WhiteBalance { get; set; }
    public string Lens { get; set; }
    public DateTime DateTaken { get; set; }
    public float Longitude { get; set; }
    public float Latitude { get; set; }
    public int Zoom { get; set; }
    public string Location { get; set; }

    public virtual Photo Photo { get; set; }
}

FeaturedPhoto.cs

public class FeaturedPhoto
{
    [Key]
    public int FeaturedPhotoID { get; set; }

    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string InformationLocation { get; set; }
    public string ImagePosition { get; set; }

    public virtual Photo Photo { get; set; }
}
4

2 に答える 2

1

エラーメッセージに従って:

複合主キーの順序を指定するには、ColumnAttribute または HasKey メソッドを使用します。

[Column(Order="#")] 注釈を PhotoExif テーブルの PhotoID および PhotoExifID プロパティに追加する必要があります。

于 2012-10-20T17:35:06.453 に答える
0

私には、複合主キーが必要ないように見えますPhotoExif。EFが複合キーを推測しようとする理由はわかりませんが、その理由はおそらく1)慣例によりプロパティが外部キーとしてPhotoプロパティを持っているためPhotoID、2)1対1の関係では外部キーが同一でなければならないためです主キー、3) キーとしてPhotoExifIDマークした別のプロパティがあります。したがって、おそらく、EF は、このマークされたキーと、1 対 1 の関係から推測されたキーが複合キーを形成すると想定しています。(この動作は非常に奇妙ですが、モデルと注釈が複合キーの順序付けに関するこの例外にどのようにつながるかはわかりません。)

とにかく、PhotoID1 対 1 の関係では、プリンシパルと従属が同じ主キーを共有する必要があり、従属の FK が同時に PK であるため、プロパティは正しくないようです。このプロパティを削除して、FK 属性を追加してみます。

public class PhotoExif
{
    [Key]
    public int PhotoExifID { get; set; }

    public string ShutterSpeed { get; set; }
    //...

    [ForeignKey("PhotoExifID")]
    public virtual Photo Photo { get; set; }
}

同様に、 の FK を定義する必要がありますFeaturedPhoto。そうしないと、EF はリレーションシップのプリンシパルと依存関係を判断できません。関係の詳細に応じて、それらは必須 - 必須、必須 - オプション、またはオプション - オプションであり、どのエンティティがプリンシパルで、どれが従属であるか? - データ注釈は Fluent API がサポートするすべてのマッピング オプションをサポートしていないため、Fluent API でマッピングを定義する必要がある場合があります。

于 2012-10-20T17:55:00.120 に答える