C# 无法将属性配置为导航属性-实体框架
我不熟悉.net和实体框架。我有两个模型C# 无法将属性配置为导航属性-实体框架,c#,.net,entity-framework,C#,.net,Entity Framework,我不熟悉.net和实体框架。我有两个模型User和Request,它们如下所示 User.cs [Table("User")] public class User { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } public DateTime Cre
User
和Request
,它们如下所示
User.cs
[Table("User")]
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public DateTime CreateDate { get; set; }
public bool IsActive { get; set; }
}
Request.cs
[Table("Request")]
public class Request
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RequestId { get; set; }
[ForeignKey("UserId")]
public int UserId { get; set; }
public string Reason { get; set; }
public DateTime CreateDate { get; set; }
}
以下是我的Linq查询:
var requests = (from req in dbcontext.Request
join user in dbcontext.User on req.UserId equals user.UserId
select new RequestOptionsDTO
{
RequestId = req.RequestId,
UserId = req.UserId,
Reason = req.Reason,
CreateDate = req.CreateDate,
UserIsActive = user.IsActive
}).ToList();
这是一个简单的查询,但我不断得到以下错误:
The property 'UserId' cannot be configured as a navigation property.
The property must be a valid entity type and the property should have a non-abstract getter and setter.
For collection properties the type must implement ICollection<T> where T is a valid entity type.
属性“UserId”不能配置为导航属性。
该属性必须是有效的实体类型,并且该属性应该具有非抽象的getter和setter。
对于集合属性,类型必须实现ICollection,其中T是有效的实体类型。
我在ASP.NETCoreWebAPI项目中运行了相同的查询,该项目使用EntityFrameworkCoreV3.1,运行良好
问题是相同的查询在使用EntityFramework6的控制台应用程序上不起作用
有人能帮我解决这个问题吗?问题不在于查询,而在于模型(模型在第一次执行查询时是惰性初始化的,因此对于来自该DbContext的任何查询,您都会得到相同的异常) 问题的实际原因是无效的
ForeignKey
属性。当应用于FK属性时(如在您的场景中),它需要关联导航属性的名称。当应用于导航属性时,它需要FK属性的名称
在本例中,“UserId”不是Request
类中导航属性的有效名称,这是错误消息试图以其独特的方式告诉您的
EF Core只是忽略了这些不一致,而EF6则按其应该的方式抛出异常。两者都不允许使用数据注释定义不带导航属性的关系。然而,EF Core允许流畅地定义这种关系,而EF至少需要一个导航属性
因此,为了定义FK关系,您需要至少添加
public User User { get; set; }
请求,或
public ICollection<Request> Requests { get; set; }
公共ICollection请求{get;set;}
发送到用户
,或两者都发送。在这两种情况下,都不需要额外的数据注释/fluent配置
当然,不要忘记删除无效的
ForeignKey
属性。问题不在于查询,而在于模型(模型在第一次执行查询时被延迟初始化,因此对于来自该DbContext的任何查询,您都会得到相同的异常)
问题的实际原因是无效的ForeignKey
属性。当应用于FK属性时(如在您的场景中),它需要关联导航属性的名称。当应用于导航属性时,它需要FK属性的名称
在本例中,“UserId”不是Request
类中导航属性的有效名称,这是错误消息试图以其独特的方式告诉您的
EF Core只是忽略了这些不一致,而EF6则按其应该的方式抛出异常。两者都不允许使用数据注释定义不带导航属性的关系。然而,EF Core允许流畅地定义这种关系,而EF至少需要一个导航属性
因此,为了定义FK关系,您需要至少添加
public User User { get; set; }
请求,或
public ICollection<Request> Requests { get; set; }
公共ICollection请求{get;set;}
发送到用户
,或两者都发送。在这两种情况下,都不需要额外的数据注释/fluent配置
当然,不要忘记删除无效的
ForeignKey
属性。EF6或EF-Core?@IvanStoev EF6。我在ASP.NETCoreWebAPI项目中运行了相同的查询,该项目使用EntityFrameworkCoreV3.1,运行良好。问题是相同的查询在使用EntityFramework6的控制台应用程序上不起作用。我已经在我的问题EF6或EF Core?@IvanStoev EF6中更新了相同的内容。我在ASP.NETCoreWebAPI项目中运行了相同的查询,该项目使用EntityFrameworkCoreV3.1,运行良好。问题是相同的查询在使用EntityFramework6的控制台应用程序上不起作用。我已经在我的问题中更新了相同的内容。我尝试过你的解决方案,但仍然会遇到相同的错误。在发布之前,我已经在我的clean test EF6环境中尝试过,错误消失了。确保已删除[ForeignKey(“UserId”)]
行。还要检查其他实体的相似属性——正如我所说的,查询不重要,您必须清理模型。如果需要,从一个干净的项目开始,添加类/属性/配置,直到addmigration
命令成功完成。我无能为力-错误已被复制并修复。顺便说一句,一旦我删除[ForeignKey(“UserId”)]
行,我会收到一个类似的错误,但它正在抱怨RequestId
<代码>属性“RequestId”不能配置为导航属性。该属性必须是有效的实体类型,并且该属性应该具有非抽象的getter和setter。对于集合属性,该类型必须实现ICollection,其中T是有效的实体类型。“Btw”只是证明原来的问题已经解决,现在您得到了类似但不同的错误。只需执行相同的操作-在代码中查找[ForeignKey(“RequestId”)]
,将其删除并添加导航属性等。重复所有类似错误-异常消息告诉无效的ForeignKey
属性(UserId
,RequestId
),您只需找到它们并应用上述解决方案,这显然是因为根据SO规则,只覆盖了原始的post问题。这就解决了它!我刚刚开始在.net上工作,对大多数术语我都是新手。很抱歉,没有理解它早些时候,并感谢您解释它的细节!再次感谢!!我已经尝试过你的解决方案,但仍然会遇到同样的错误。在发布之前,我已经在我的clean test EF6环境中尝试过了,错误消失了。你一定要