Asp.net mvc &引用;协会的主要目的环境足迹
无法确定服务器之间关联的主体端 键入“XYZ.Models.Attachment”和“XYZ.Models.Accounts.User”。这个 必须使用显式配置此关联的主体端 关系可以是fluent API或数据批注 调用的目标已引发异常 当我尝试用我的EF模型更新数据库时,我遇到了这个错误 User.cs的一部分:Asp.net mvc &引用;协会的主要目的环境足迹,asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,无法确定服务器之间关联的主体端 键入“XYZ.Models.Attachment”和“XYZ.Models.Accounts.User”。这个 必须使用显式配置此关联的主体端 关系可以是fluent API或数据批注 调用的目标已引发异常 当我尝试用我的EF模型更新数据库时,我遇到了这个错误 User.cs的一部分: [Table("Users")] public class User { [Key] [DatabaseGeneratedAttribute(DatabaseGen
[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; }
}
附件.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; }
}
为什么我会犯这个错误?如何解决呢
关于映射约定检测到
用户.照片
和附件.作者
之间的一对一关系,无法推断主体和从属端是什么。因此有例外
实际上,根据你的评论,你想要两种关系,而不是一对一的关系。只有通过使用Fluent API重写约定才能实现这一点,并且可能需要使其中一个关系成为可选关系,因为否则,用户
和附件
之间存在循环相互依赖关系。例如,您可以通过选择一个可为空的外键使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);
modelBuilder.Entity()
.has可选(u=>u.Photo)
.有很多
.HasForeignKey(u=>u.MainPhotoId);
modelBuilder.Entity()
.HasRequired(a=>a.Author)
.有很多
.HasForeignKey(a=>a.UserId);
使用此映射,您可以删除
[ForeignKey]
属性,因为FK属性的定义是Fluent API映射的一部分(HasForeignKey
)。类是否完整,或者是否省略了某些属性?这个例外对于这个模型没有意义。按照惯例,两者之间显然存在一对多的关系,用户
显然是“主要目的”。哇!很抱歉我忘了粘贴User.cs
model.的主要部分。。请看“现在编辑”。除了主照片,用户还可以有许多其他附件吗?是的!当然我只想在MainPhoto
上使用延迟加载
。但一般来说,用户也可以有其他附件。