我正在使用Entity Framework 6和Code First。
基本上,我的数据库有一个电影和一个具有一对多关系的图像表(电影有外键: Image_Id )。
图片有一个名为 Url 的列。
当我想显示电影列表时,我想要显示图像URL和它们。现在我被迫访问图像表本身,例如:
string imageUrl = movie.Image.Url;
这似乎是一种不必要的加入。
如何在电影中添加 Url 列作为外来属性,这样我就可以在不加载图片的情况下访问它(有点像 Image_Id )。
答案 0 :(得分:0)
有几种选择。选项1是对数据库进行反规范化,并将图像URL存储在Movie
表中。选项2是在数据库中创建一个处理连接的视图。最后选项3是使用EF 6 include来防止延迟加载N + 1查询问题。
只要Movie
和Image
是2个不同的表,就必须加入数据。如果将图像存储为BLOB字节数组,则可以将.Select()
与匿名对象一起使用,以避免在不需要时撤回BLOB。如果你花时间学习一些内部工作以及它如何构建查询,那么EF可以非常高效
答案 1 :(得分:0)
我认为一部电影有很多图片,所以每张图片都应该有一部外键给它所属的电影,比如MovieId。
每部电影都有零个或多个影像。因此,电影无法拥有外键image_id:它指向的数千张图像中的哪一幅?所以我认为这是一个错字?
您需要访问图像表的原因是因为您没有正确configure your one-to-many关系。如果使用正确的Code-First conventions,您甚至不需要Attributes或Fluent Api。但即使您想要非常规列名,也可以在没有连接的情况下使用您的查询(但是,内部实体框架将创建正确的连接)
适当的电影有很多图像模型将是:
class Movie
{
public int Id {get; set;}
// a movie has zero or more images:
public virtual ICollection<Image> Images {get; set;}
... // other properties
}
class Image
{
public int Id {get; set;}
// every image belongs to exactly one movie using foreign key:
public int MovieId {get; set;}
public virtual Movie Movie {get; set;}
... // other properties
}
这就是全部!实体框架知道您计划建模一对多关系并为您创建正确的表,主键和外键。
此外,您的查询会更容易:
不要在联想中思考,想想要查询的馆藏!
“给我所有出演Doris Day的电影,以及前五分钟拍摄的所有照片:
var result = myDbContext.Movies
.Where(movie => movie.Start == "Doris Day"
.Select(movie => new
{
Title = movie.Title,
First5Minutes = movie.Images
.Where(image => image.StartTime < TimeSpan.FromMinutes(5))
.Select(image => image.Url)
.ToList(),
}
实际上它可能无法与TimeSpans一起使用,但你得到了要点。
如果您坚持命名外键image_id
而不是传统的ImageId,则应使用流畅的API或属性来告诉实体框架创建所需的外键。请参阅上面的一对多链接。