“协会的主要结束” - EF

时间:2013-09-22 12:07:20

标签: asp.net-mvc entity-framework asp.net-mvc-4

  

无法确定之间关联的主要结束   类型'XYZ.Models.Attachment'和'XYZ.Models.Accounts.User'。该   必须使用显式配置此关联的主要结尾   关系流畅的API或数据注释。

     

调用目标抛出了异常。

当我尝试使用我的EF模型update-database时,我得到了这个错误。

User.cs的一部分:

[Table("Users")]
public class User
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public int MainPhotoId { get; set; }

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

Attachment.cs

[Table("Attachments")]
public class Attachment
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AttachmentId { get; set; }

    public string name { get; set; }


    public int UserId { get; set; }
    public DateTime AddDate { get; set; }

    public bool del { get; set; }

    [ForeignKey("UserId")]
    public virtual User Author { get; set; }

}

为什么我收到此错误?以及如何解决它?

此致

1 个答案:

答案 0 :(得分:1)

映射约定检测User.PhotoAttachment.Author之间的一对一关系,无法推断主体和依赖端是什么。因此例外。

实际上,根据您的评论,您需要两个关系,而不是一对一的关系。您只能通过使用Fluent API覆盖约定来实现这一点,并且您可能需要创建其中一个关系可选,否则您在UserAttachment之间存在循环相互依赖关系。例如,您可以通过选择可为空的外键使User.Photo属性可选:

public int? MainPhotoId { get; set; }

然后映射看起来像这样:

modelBuilder.Entity<User>()
    .HasOptional(u => u.Photo)
    .WithMany()
    .HasForeignKey(u => u.MainPhotoId);

modelBuilder.Entity<Attachment>()
    .HasRequired(a => a.Author)
    .WithMany()
    .HasForeignKey(a => a.UserId);

使用此映射,您可以删除[ForeignKey]属性,因为FK属性的定义是Fluent API映射(HasForeignKey)的一部分。