Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PostgreSQL实体框架定义一对多关系的一面_C#_Postgresql_Entity Framework Core - Fatal编程技术网

C# 使用PostgreSQL实体框架定义一对多关系的一面

C# 使用PostgreSQL实体框架定义一对多关系的一面,c#,postgresql,entity-framework-core,C#,Postgresql,Entity Framework Core,从本质上讲,我试图使用PostgreSQL实体框架定义一对多关系的一面,并产生以下错误: System.InvalidOperationException:'无法确定由类型为'TypeDao'的导航属性'UserDao.TypeDao'表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.ignore”忽略此属性。 所以有一点细节: 我正在使用asp.net core 3.1使用Razor页面,数据库是Po

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

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

所以有一点细节:

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

这是一个使用EntityFramework 6.x和SQL Server的MVC项目的转换

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

我将讨论两个数据访问类UserDaoTypeDao

TypeDao在数百个表上的整个数据库中使用,因此我想要实现的是UserDao有一个TypeDaoTypeDao“可用于”许多用户。因此,我不想在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; }
}
正如您所看到的,由于可以添加新类型,因此在“类型返回到用户作为创建者”中定义了一个关系,但在“用户到类型”中定义的关系的另一端不存在任何关系

这感觉像是错误的可能根源,因为如果ef推断我不希望Creator关系是User中类型关系的另一端,这可能会让ef感到困惑


所以。。。如何做到这一点?

这样的关系需要-a
有{One | Many}
后跟{code>和{One | Many}对。它们用于标识关系端点、多重性和每个端点的关联导航属性(或无导航属性)

因此,从
TypeDao.Creator
中“unpair”
UserDao.Type
所需的最小值是

modelBuilder.Entity<UserDao>()
    .HasOne(e => e.Type) // reference navigation property
    .WithMany(); // no collection navigation property
modelBuilder.Entity()
.HasOne(e=>e.Type)//引用导航属性
.WithMany();//没有集合导航属性

modelBuilder.Entity()
.HasOne(e=>e.Creator)//引用导航属性
.WithMany();//没有集合导航属性

有关更多信息,请参阅EF Core文档部分。

非常感谢Ivan。这是正确的解决方案,它非常有效。我一直只使用注释,但不知道如何使用注释。将花几个小时处理EF文档,并执行一些流畅的Api操作:)如果有人知道一个仅注释的解决方案,我会很感兴趣,只是出于兴趣,看看它是否可以使用dome。欢迎您。不,没有数据注释解决方案。唯一的“配对”注释是
[InverseProperty]
,但它需要有效的属性名称,并且不接受
null
来表示“无属性”。
modelBuilder.Entity<TypeDao>()
    .HasOne(e => e.Creator) // reference navigation property
    .WithMany(); // no collection navigation property