1

ProductPictureの 2 つのエンティティがあります。商品の画像は 1 つしかない場合もあれば、まったくない場合もあり、1 つの画像を多くの商品にマッピングできるという考え方です。

public class Product
{
    public int Id {get; set;}

    public Picture Picture { get; set; }

    public bool Enabled { get; set; }

    public string Text { get; set; }
}

Pictureエンティティは、すべての写真を含む別の Pictures エンティティへのマッピングであるため (この Picture エンティティには、製品の写真のみのマッピングが含まれます)、基本的に ID を持つ 2 つの列のみが含まれます。

public class Picture
{
    public int Id {get; set;}

    public int PictureId { get; set; }
}

これは、 Productエンティティのモデル バインダーです。

modelBuilder.Entity<Product>().HasOptional<Picture>(pr => pr.Picture);

画像付きのProductエンティティを作成するか、既存のエンティティに画像を追加すると、 Productテーブルに作成されたPicture_Id列に、PictureテーブルのIdが正しく取り込まれます。問題は、 Productを取得しようとしたときです。Productエンティティ内のPictureエンティティが null です。マッピングが間違っていると思います。Productエンティティを取得するときに、 PictureエンティティをProductエンティティ内に設定する方法を教えてください。取得コードは次のとおりです。

 public Product GetProductById(int productId)
    {
        var query = from pr in _productRepository.Table
                    where pr.Id == productId
                    select pr;

        return query.FirstOrDefault();
    }

編集:依存性注入に含めるカスタムIRepositoryサービスを使用しています

IRepository<Product>

IRepositoryインターフェイスには、次のメソッドが含まれています

    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
    IQueryable<T> Table { get; }

これはTableの実装です:

 public virtual IQueryable<T> Table
    {
        get
        {
            return this.Entities;
        }
    }

    private IDbSet<T> Entities
    {
        get
        {
            if (_entities == null)
                _entities = _context.Set<T>();
            return _entities;
        }
    }

IQueryableであるため、.Include("Picture")Tableに追加できません。遅延読み込みも有効にしましたが、結果はありませんでした。

4

3 に答える 3

2
var products = db.Pictures.Include("Product");

public Product GetProductById(int productId)
    {
        var query = from pr in products
                    where pr.Id == productId
                    select pr;

        return query.FirstOrDefault();
    }
于 2013-02-13T11:59:03.493 に答える
2

関連するエンティティをロードするには include を使用する必要があります。

public Product GetProductById(int productId)
{
    using (var db = new ProductContext())
    {
       var query = from pr in db.Products.Include("Picture")
                   where pr.Id == productId
                   select pr;

        return query.FirstOrDefault();
    }
}
于 2013-02-13T12:11:14.623 に答える
0

問題を修正しました。これが正しい方法かどうかはわかりませんが、うまくいきます。

次の変更を行いました。

    public class Product
{
    public int? PictureId { get; set; }

    public int Id {get; set;}

    public Picture Picture { get; set; }

    public bool Enabled { get; set; }

    public string Text { get; set; }
}

modelBuilder.Entity<Product>().HasOptional<Picture>(pr => pr.Picture).WithMany().HasForeignKey(pr => pr .PictureId);

public Product GetProductById(int productId)
    {
        var query = from pr in _productRepository.Table
                    where pr.Id == productId
                    select pr;

        var product = query.FirstOrDefault();
        AddProductPicture(product);

        return product;
    }

private void AddProductPicture(Product product)
{
    var query = from pic in _pictureRepository.Table
                        where pic.Id == product.PictureId
                        select pic;

            product.Picture = query.FirstOrDefault();
}
于 2013-02-13T15:11:43.440 に答える