【问题标题】:Defining one side of a one to many relationship with PostgreSQL entity Framework使用 PostgreSQL 实体框架定义一对多关系的一侧
【发布时间】:2020-03-21 10:45:12
【问题描述】:

本质上,我试图使用 PostgreSQL 实体框架定义一对多关系的一侧,并产生以下错误:

System.InvalidOperationException: '无法确定'TypeDao' 类型的导航属性'UserDao.TypeDao' 表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

所以有点细节:

我正在使用使用 Razor 页面的 asp.net core 3.1,数据库是 Postgres 12.2,我正在使用 Npgsql.EntityFrameworkCore.PostgreSQL 3.1.2

这是从使用 SQL Server 的 EntityFramework 6.x 的 MVC 项目转换而来的

这是一个现有的大型数据库,因此不使用迁移,而是手动编码数据访问对象和上下文。

我会讲两个数据访问类UserDaoTypeDao

TypeDao 在整个数据库中的数百个表中使用,所以我想要实现的是 UserDao 有一个 TypeDao TypeDao“可以在”很多用户中使用。所以我不想要一个集合,实际上是数百个集合,在 UserDaoProductDao 等的 TypeDao 对象中。

这里是我的 UserDaoTypeDao 数据访问对象的精简版本:

[Table("user", Schema = "shared_kernal")]
public class UserDao
{
    [Key]
    [Column("id")]
    public Guid Id { get; set; }

    [Column("type_id")]
    public Guid? TypeId { get; set; }

    [ForeignKey("TypeId")]
    public TypeDao Type { get; set; }
}

[Table("type", Schema = "shared_kernal")]
public class TypeDao
{
    [Key]
    [Column("id")]
    public Guid Id { get; set; }

    [Column("creator_id")]
    public Guid CreatorId { get; set; }

    [ForeignKey("CreatorId")]
    public UserDao Creator { get; set; }
}

如您所见,在 Type 中定义了一个关系返回到作为创建者的用户,因为可以添加新类型,但没有任何关系打算成为 User 到 Type 中定义的关系的另一端

这感觉像是错误的可能根源,因为它很可能会混淆 ef 推断我不希望 Creator 关系成为 User 中 Type 关系的另一端。

那么...怎么做呢?

【问题讨论】:

    标签: c# postgresql entity-framework-core


    【解决方案1】:

    此类关系需要 Manual configuration - Has{One|Many} 后跟 With{One|Many} 对。这些用于标识关系端、多重性和每个端的关联导航属性(或无导航属性)。

    因此,从TypeDao.Creator“取消配对”UserDao.Type 所需的最低要求是

    modelBuilder.Entity<UserDao>()
        .HasOne(e => e.Type) // reference navigation property
        .WithMany(); // no collection navigation property
    

    modelBuilder.Entity<TypeDao>()
        .HasOne(e => e.Creator) // reference navigation property
        .WithMany(); // no collection navigation property
    

    有关详细信息,请参阅 EF Core 文档的Relationships - Manual Configuration - Single navigation property 部分。

    【讨论】:

    • 非常感谢伊万。这是正确的解决方案,它工作得很好。我一直只是使用注释,但不知道如何使用注释。将在 EF 文档上花费几个小时并进行一些 Fluent Api 操作:) 如果有人知道仅注释的解决方案只是出于兴趣看看它是否可以是圆顶,将会很感兴趣。
    • 不客气。不,没有数据注释解决方案。唯一的“配对”注解是[InverseProperty],但它需要有效的属性名称,并且不接受""null 表示“无属性”。
    • 对此进行快速更新。我实际上已经离开了 EF,现在使用 Dapper,几行额外的代码,但 omg 控件 :) 并不是说​​ EF 不好,只是对已经发展的微 ORM 的偏好。
    猜你喜欢
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2017-06-27
    • 2021-12-10
    • 2016-07-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多