1

我无法理解如何在我正在构建的项目中创建类之间的关系。

我有一个类Photo与 具有必需的一对一关系PhotoExif,并且与Photo具有可选的一对一关系FeaturedPhoto

我收到错误:

无法确定类型的复合主键排序Website.Models.PhotoExif。使用ColumnAttributeHasKey方法指定复合主键的顺序。

帮助将不胜感激。

照片.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; }
} 

照片Exif.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; }
}

精选照片.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 方法来指定复合主键的顺序。

您需要在 PhotoExif 表的 PhotoID 和 PhotoExifID 属性中添加 [Column(Order="#")] 注释。

于 2012-10-20T17:35:06.453 回答
0

在我看来,您不希望在PhotoExif. 我不知道为什么 EF 会尝试推断复合键,但原因可能是 1)该属性按照惯例Photo将该PhotoID属性作为外键,2)在一对一的关系中,外键必须与主键,3)还有另一个属性PhotoExifID你已经标记了一个键。因此,也许 EF 假设这个标记的密钥加上从一对一关系中推断出来的密钥一起形成了一个复合密钥。(这种行为会很奇怪,但我看不出您的模型和注释如何导致复合键排序异常。)

无论如何,该PhotoID属性似乎不正确,因为在一对一关系中,主体和依赖必须共享相同的主键,并且依赖的 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 回答