【问题标题】:The property 'x' is not a navigation property of entity type 'y'属性“x”不是实体类型“y”的导航属性
【发布时间】:2018-03-31 23:44:41
【问题描述】:

我将 EF Core 与 ASP Core 2.0 一起使用。使用最新的身份框架。我在全部页面上收到此异常。

InvalidOperationException:属性“用户”不是实体类型“画廊”的导航属性。 'Include(string)' 方法只能与 '.' 一起使用。导航属性名称的分隔列表。

ApplicationUser 看起来像:

public class ApplicationUser : IdentityUser<Guid>
{
    public ICollection<Gallery> Galleries { get; set; }
}

实体库看起来像:

public class Gallery
{
    public int Id { get; set; }
    public Guid UserId { get; set; }
    public string Title { get; set; }
    public int? ArticleId { get; set; }
    public string Photos { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }

    public Article Article { get; set; }
    public ApplicationUser User { get; set; }

    [NotMapped]
    public List<string> PhotosList
    {
        get { return Photos?.Split('|').ToList(); }
        set { Photos = string.Join("|", value); }
    }
}

视图控制器如下所示:

public async Task<IActionResult> All()
    {
        var databaseContext = db.Galleries.Include(x => x.Article).Include(x => x.User);

        return View(await databaseContext.ToListAsync());
    }

我不知道为什么它不会在文章上崩溃..

数据库是最新的。

【问题讨论】:

  • this 有帮助吗?
  • kabanus:不,外键没有帮助
  • Cristic:好吧,我没有选项 x.ApplicationUser 因为我定义了名为 User 而不是 ApplicationUser 的导航。ApplicationUser 是类而不是变量名
  • 值得注意。我在我的场景中犯了一个错误。我正在使用 Database.Order.Include(o => o.ShopId) 而实际上它应该是 Database.Order.Include(o => o.Shop) - 在我的情况下实际上是一个错字 - 只要检查你是不是不小心像在 SQL 查询中一样链接到 Id。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

添加ForeignKey 属性

using System.ComponentModel.DataAnnotations.Schema;

...

[ForeignKey("Article")]
public int? ArticleId { get; set; }

[ForeignKey("User")]
public Guid UserId { get; set; }

你也可以把属性放在导航属性上

[ForeignKey("UserId")]
public ApplicationUser User { get; set; }

另外,请确保您的 dbContext 继承自 IdentityDbContext&lt;ApplicationUser, ...&gt;

【讨论】:

  • 好吧,它仍然不能解决我的问题..即使有属性:(还有什么下一个想法吗?谢谢
  • @user1085907 试试User属性上的版本
  • @user1085907 你的 dbContext 声明是什么样的?它是从IdentityDbContext&lt;ApplicationUser, ...&gt; 继承的吗?
  • 实际上不,它继承了 DbContext,我使用了两个 DatabaseContexts,1 个仅用于 Identity,第二个用于包含 ApplicationUser 的实体(OnModelCreating 我忽略了 ApplicationUser 表)。我应该只使用 1 个上下文吗?
  • @user1085907 我认为使用 1 个上下文可以解决您的导航属性问题。
【解决方案2】:

如果您手动向模型添加额外的属性,您可能会遇到这种情况。

要对其进行故障排除,请运行 SQL Profiler 并捕获原始 SQL,对数据库执行 SQL 并查看查询不工作的原因,即哪个属性“x”不是实体类型“y”的导航属性。

然后转到模型并删除您手动添加的额外属性。

ps 如果您没有 SQL dB,您可以使用另一个分析器。或者,只需检查源代码控制中的差异。

【讨论】:

  • 这肯定是根本原因,但是程序也需要手动添加属性。更好的解决方案是检测该属性是否是底层模型的一部分(即一个布尔结果,告诉我们该属性是否对 LINQ-to-SQL 有效)。错误已经告诉我们它不喜欢哪个属性。
猜你喜欢
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多