如何向表中添加其他外来属性?

时间:2017-10-30 21:41:28

标签: c# sql entity-framework entity-framework-6 ef-code-first

我正在使用Entity Framework 6和Code First。

基本上,我的数据库有一个电影和一个具有一对多关系的图像表(电影有外键: Image_Id )。

图片有一个名为 Url 的列。

当我想显示电影列表时,我想要显示图像URL和它们。现在我被迫访问图像表本身,例如:

string imageUrl = movie.Image.Url;

这似乎是一种不必要的加入。

如何在电影中添加 Url 列作为外来属性,这样我就可以在不加载图片的情况下访问它(有点像 Image_Id )。

2 个答案:

答案 0 :(得分:0)

有几种选择。选项1是对数据库进行反规范化,并将图像URL存储在Movie表中。选项2是在数据库中创建一个处理连接的视图。最后选项3是使用EF 6 include来防止延迟加载N + 1查询问题。

只要MovieImage是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或属性来告诉实体框架创建所需的外键。请参阅上面的一对多链接。