C# 使用PostgreSQL实体框架定义一对多关系的一面
从本质上讲,我试图使用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项目的转换 这是一个大型的现有数据库,因此不使用迁移,而是手工编写数据访问对象和上下文 我将讨论两个数据访问类UserDao和TypeDao TypeDao在数百个表上的整个数据库中使用,因此我想要实现的是UserDao有一个TypeDao,TypeDao“可用于”许多用户。因此,我不想在UserDao、ProductDao等的TypeDao对象中有一个集合,事实上有数百个集合 下面是我的UserDao和TypeDao数据访问对象的精简版本: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
[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