Косвенное поле навигации с EF4 - PullRequest
0 голосов
/ 22 ноября 2011

Мне интересно, возможно ли иметь свойство / поле в классе, который заполняется непосредственно из базы данных. Я знаю, что непосредственная реализация этого нарушит шаблоны проектирования, такие как разделение интересов, но я надеюсь иметь некоторую конфигурацию в функции OnModelCreating моего DbContext.

В приведенном ниже примере, учитывая 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
        }
    }
    */
}

Просто чтобы уточнить: моя модель не , как та, что приведена ниже, но она работает таким же образом (так что мне нужно это разделение классов с этой "таблицей соединений").

AFAIK, используя LINQ, я мог найти нужную информацию со следующим:

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

Это означает, что это запрос, который я хотел бы вставить в мой класс Product! Заранее спасибо!

1 Ответ

0 голосов
/ 22 ноября 2011

Я выполнил свои задачи, изменив модель, чтобы она соответствовала следующему (с изменениями, описанными как комментарии):

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); 
            } 
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...