没有FK,无法使“ include”与EF核心配合使用

时间:2019-01-14 20:15:03

标签: entity-framework .net-core entity-framework-core

我在SQL Server中有2个不带FK的表:

enter image description here

所以每个Image有很多Comments

使用此命令,我创建了脚手架文件:

  

dotnet ef dbcontext支架   “服务器= sff-pc;数据库= IMG; Trusted_Connection =真实;”   Microsoft.EntityFrameworkCore.SqlServer -o模型-t 图像 -t   评论 --context-dir上下文-c MyContext -f

以下是生成的文件:

 public partial class Images
    {
        public int ImageId { get; set; }
        public Guid ImgGuid { get; set; }
        public string ImgExtension { get; set; }
        public DateTime Datecreated { get; set; }
        public string Origin { get; set; }
        public decimal? Size { get; set; }
        public string Ip { get; set; }
        public int UserId { get; set; }
        public string Description { get; set; }
        public bool? IsActive { get; set; }
        public int? VotesUp { get; set; }
        public int? VotesDown { get; set; }
        public int ImgType { get; set; }
    }

public partial class Comments
{
    public int CommentId { get; set; }
    public int ImageId { get; set; }
    public int UserId1 { get; set; }
    public string CommentTxt { get; set; }
    public DateTime DateCreated { get; set; }
    public bool? IsActive { get; set; }
}

问题:

使用这些生成的类和这个full context file,如何获得ImageInclude中的每个comments

我尝试了什么:

我尝试添加ForeignKey属性:

 public partial class Comments
    {
        public int CommentId { get; set; }

        [ForeignKey("Images")]          <--------------Here
        public int ImageId { get; set; }
        public int UserId1 { get; set; }
        public string CommentTxt { get; set; }
        public DateTime DateCreated { get; set; }
        public bool? IsActive { get; set; }
    }

并运行它:

        var context = new MyContext();
        var result = context.Images.Include("Comments"); //exception

         foreach (var a in result)
         {
             Console.WriteLine(a);
         }

例外:

属性“注释”不是实体类型“图像”的导航属性

1 个答案:

答案 0 :(得分:2)

当您在fk上使用[ForeignKey("Images")]时,“ Images”应该是Comments类中的 navigation属性,而不是DbSet属性的名称在您的DbContext中。您可以阅读更多hererelationships here。如果您的代码基于Comments类的定义,则需要具有属性Images

[ForeignKey("Images")]          
public int ImageId { get; set; }
public Images Images { get; set; } // ForeignKey attribute points to this

尽管上面显示了如何使用[ForeignKey("Images")],但我建议使用属性名称Image代替Images。它不仅是一个更好的解释性名称,而且也将使[ForeignKey("Image")]变得不必要。 EF会通过命名约定自动将Image映射到Image id

根据您使用context.Images.Include("Comments")访问评论的方式,您似乎正在尝试访问图像下的评论列表。但是,如果您注意到result变量将是IQueriable中的Images。为此,您需要在Images类中添加一个导航属性。

public IEnumerable<Comments> Comments { get; set; }

由于已经映射了外键,因此映射在ImageIdComments之间是隐式的。但是,您可以使用InverseProperty属性来确保安全(请查看relationships link以获取更多信息)。完成此操作后,您可以使用以下代码:

var result = context.Images.Include(i => i.Comments);