无法确定之间关联的主要结束 类型'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; }
}
为什么我收到此错误?以及如何解决它?
此致
答案 0 :(得分:1)
映射约定检测User.Photo
和Attachment.Author
之间的一对一关系,无法推断主体和依赖端是什么。因此例外。
实际上,根据您的评论,您需要两个关系,而不是一对一的关系。您只能通过使用Fluent API覆盖约定来实现这一点,并且您可能需要创建其中一个关系可选,否则您在User
和Attachment
之间存在循环相互依赖关系。例如,您可以通过选择可为空的外键使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
)的一部分。