EF4间接导航场

本文关键字:导航 EF4 | 更新日期: 2023-09-27 18:15:25

我想知道是否有可能在一个直接从数据库填充的类中有一个属性/字段。我知道直接实现它会破坏设计模式,例如关注点分离,但我希望在DbContextOnModelCreating函数中有一些配置。

在下面的例子中,给定一个Product,我想找出它出现在哪个PriceTables上:

public class PriceTable
{
    public int ID { get; set; }
    public HashSet<Price> Prices { get; set; }
    public PriceTable()
    {
        Prices = new HashSet<Price>();
    }
}
public class Price
{
    public int ID { get; set; }        
    public double Value { get; set; }
    public int ProductID { get; set; }
    public virtual Product Product { get; set; }
    public int PriceTableID { get; set; }
    public virtual PriceTable PriceTable { get; set; }
}
public class Product
{
    public int ID { get; set; }
    public String Name { get; set; }
    // This is what I'd like to achieve
    /*
    public HashSet<PriceTable> PriceTables { 
        get {
            // and here, return something from the DB
        }
    }
    */
}

只是澄清一下:我的模型是而不是下面的,但它以相同的方式工作(因此我需要这种类分离,使用这个"连接表")。

我可以使用LINQ找到我想要的信息:

 from p in Prices
 where p.Product.ID == MY_PRODUCT_ID
 select p.PriceTable

这意味着这是查询我想嵌入在我的Product类!提前感谢!

EF4间接导航场

我通过更改模型来匹配以下内容(使用注释描述的更改)来完成我的目标:

public class PriceTable
{
    public int ID { get; set; }
    public HashSet<Price> Prices { get; set; }
    // New field, which allows me to query "all the Products in some PriceTable"
    public IEnumerable<Product> Products
        {
            get
            {
                return Prices.Select(p => p.Product);
            }
        }
    public PriceTable()
    {
        Prices = new HashSet<Price>();
    }
}
public class Price
{
    public int ID { get; set; }        
    public double Value { get; set; }
    public int ProductID { get; set; }
    public virtual Product Product { get; set; }
    public int PriceTableID { get; set; }
    public virtual PriceTable PriceTable { get; set; }
}
public class Product
{
    public int ID { get; set; }
    public String Name { get; set; }
    // New field, previsouly automatically generated by EF4
    public HashSet<Price> Prices { get; set; } 
    // New field, which allows me to query "all the PriceTables on which a Product appears"
    public IEnumerable<PriceTable> PriceTables 
        {
            get 
            { 
                return Prices.Select(p => p.PriceTables); 
            } 
        }
}