为什么我的查询在使用Entity Framework时无法加载相关数据?

时间:2017-01-16 00:29:40

标签: c# entity-framework

我正在使用Entity Framework 6.1,其实体模型到目前为止由三个实体组成,ProductProductImageFile。但是,虽然我的数据已成功保存到数据库,但我在通过Include()方法使用预先加载加载数据时遇到了一些困难。我使用的实体如下。

产品实体:

public class Product
{
    ICollection<ProductImage> images;

    public Product ()
    {
        images = new List<ProductImage>();
    }   

    public ICollection<ProductImage> Images
    {
        get { return images; }
        set { images = value; }
    }
}

文件实体:

public class File
{
    private Guid fileId;

    public File()
    {
        FileId = Guid.NewGuid();
    }

    public Guid FileId
    {
        get { return fileId; }
        set { fileId = value; }
    }
}

ProductImage实体:

public class ProductImage
{
    private File file;
    private Product product;

    private ProductImage()
    {
        file = new File();
        product = new Product();
    }

    public ProductImage(Product product, File file)
    {
        this.product = product;
        this.file = file;
    }

    [Key]
    [Column(Order = 0)]
    [ForeignKey("Product")]
    public int ProductId
    {
        get { return product.ProductId; }
        set { product.ProductId = value; }
    }

    [Key]
    [Column(Order = 1)]
    [ForeignKey("File")]
    public Guid FileId
    {
        get { return file.FileId; }
        set { file.FileId = value; }
    }

    public File File
    {
        get { return file; }
        set { file = value; }
    }

    [InverseProperty("Images")]
    public Product Product
    {
        get { return product; }
        set { product = value; }
    }       
}

然后,我尝试使用以下函数加载Product,其ProductImage和相关File使用以下内容:

static Product LoadProduct(int productId)
{
    using (var db = new ProductCatalogueDbContext())
    {
        var query = from product in db.Products
                        .Include(p => p.Images.Select(i => i.File))
                        .Where(p => p.ProductId == productId)                                                         
                        select product;
        return query.SingleOrDefault();
    }
}

我使用的查询是否存在问题?

2 个答案:

答案 0 :(得分:1)

是的,您的代码存在问题 - 您可以自由地将LINQ查询的类似SQL的样式与&#34;点符号&#34; - 你不能那样做....

我个人更喜欢&#34;点符号&#34; - 在这种情况下,您需要对LINQ查询的所有部分使用该表示法:

 var query = db.Products
               .Include(p => p.Images.Select(i => i.File))
               .Where(p => p.ProductId == productId)
               .Select(p => p);

据我所知,Include并没有类似SQL的&#34;等价的,所以你要么必须&#34;结合&#34;正确使用类似SQL的语法,或者只使用&#34;点符号&#34;一直......

答案 1 :(得分:0)

虽然我不完全理解数据未加载的全部原因但事实证明我能够部分地识别原因。在ProductImage的Ctor中实例化File对象并赋予其对File属性返回的文件字段的引用,这导致了问题。

在加载属性实际上没有返回null之前,我遇到了EF加载数据的问题。与延迟加载的实体相关的问题。从我可以推断,虽然这可能是错误的,但似乎除非属性返回null,否则EF实际上不会从与属性相关的数据库中加载数据?