【发布时间】:2017-12-09 11:56:00
【问题描述】:
我有一个场景,用户可以上传多张照片(一对多)。 用户还可以拥有默认照片(一对一)。但是,我的实体框架core 2.0告诉我使用以下代码时他无法识别关系:
public class User
{
public Guid Id { get; set; }
public ICollection<Photo> Photos{ get; set; }
public Photo DefaultPhoto { get; set; }
[ForeignKey("DefaultPhoto")]
public Guid DefaultPhotoId { get; set; }
}
public class Photo
{
public Guid Id { get; set; }
public User Owner { get; set; }
}
我怎样才能实现这些多重关系?
EF-Core 显示错误:
System.InvalidOperationException: '无法确定由'User' 类型的导航属性'Photo.Owner' 表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。
更新:
将[InverseProperty("Photos")] 添加到文件模型中的导航属性Owner 似乎有效。我不确定这是否正确?
在这张图片中 File=Photo; Uploader=Owner(与上述模型相媲美)。
更新 2:
我确认@Ivan 在 cmets 中所说的,通过 DataAnnotation 方法,我在两个方向上得到一对多,而不是一对多和一对一。下图是使用InverseProperty生成的数据库(to实体之间的连接是双向的一对多关系):
在这张图片中 File=Photo; Uploader=Owner(与上述模型相媲美)。
【问题讨论】:
-
这个属性告诉另一个类的哪个属性是导航属性的“另一端”。因此,通过使用 [InverseProperty("Owner")]` 标记
Photos,您可以知道 User 类中导航属性 Photos 的另一端是Photo类中的属性Owner。同样可以反过来做。如果你用[InverseProperty("Photos")]标记Owner- 你也在做同样的事情。为什么它以一种方式起作用,而对你却不起作用——我不确定。 -
我想是的。当我从您的问题中的模型生成数据库时 - 其中一个(
OwnerId)被声明为可为空。我想知道当您尝试插入当前数据库时会发生什么。 -
InverseProperty只解决了一半的问题——正确关联定义导航属性的一对多关系。然而,按照惯例,第二种关系是一对多,而不是所希望的一对一。忘记数据注释,流畅的配置是必须的。 -
这样 - 默认情况下,
User中的Photo DefaultPhoto的倒数类似于Photo中的ICollection<User> DefaultPhotoUsers,或者换句话说 - 一对多。无法使用数据注释将其配置为一对一,因此您应该使用流畅的 API(如@gldraphael 答案)。 -
没错。
标签: c# .net entity-framework asp.net-core entity-framework-core