我在SQL Server中有2个不带FK的表:
所以每个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,如何获得Image
和Include
中的每个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);
}
例外:
属性“注释”不是实体类型“图像”的导航属性
答案 0 :(得分:2)
当您在fk上使用[ForeignKey("Images")]
时,“ Images”应该是Comments
类中的 navigation属性,而不是DbSet
属性的名称在您的DbContext
中。您可以阅读更多here和relationships 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; }
由于已经映射了外键,因此映射在ImageId
和Comments
之间是隐式的。但是,您可以使用InverseProperty
属性来确保安全(请查看relationships link以获取更多信息)。完成此操作后,您可以使用以下代码:
var result = context.Images.Include(i => i.Comments);