poco类设置来自另一个实体的默认值

时间:2014-06-20 08:05:04

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

public class Price
{
    public int Id { get; set; }
    public decimal Price { get; set; }
}

public class Product
{
    public Product()
    {
        // Set default value here
    }
    public int Id { get; set; }
    public string Sku { get; set; }
    public int PriceId { get; private set; }

    public virtual Price Price { get; set; }
}

我在互联网上搜索了在字段中设置默认值的最佳方法。他们说放入constructor或制作backing field。现在,如果我想从另一个实体的字段值中设置实体中的默认值,该怎么办?比方说,Product的{​​{1}}的默认值是最新的Price(在Price类中)

你是如何实现这一目标的?

Price

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

我要做的是当我查询数据库以返回Product / Products时,我会让它为我填写价格。

这仅用于演示目的

我会做类似的事情:

public class MyDataAccessLayer
{
    public IEnumerable<Product> GetProducts()
    {
        return DbContext.Products.Select(x => new Product 
        { 
            Price = Context.Price.FirstOrDefault().OrderByDescending(c => c.Id)
        };
    }

    public Product GetProduct(string id)
    {
        var product = DbContext.Products.FirstOrDefault(x => x.Id == id);
        if (product != null)
        {
           product.Price = Context.Price.FirstOrDefault().OrderByDescending(c => c.Id);
        }

        return product;
    }
}

我绝对会让我Data Access Layer为我提取并让它从数据库中填入最新价格,并且让POCO访问我的数据库。

答案 1 :(得分:1)

将最后一次插入Product e保留在Cache中。当您从Product创建新的Product获取最后Cache并在构造函数中设置默认值时以及在插入新的Product更新Cache时。 当您插入新产品时,它与从数据库获取最后一个产品相同,因为新插入的产品是数据库中的最后一个产品。所以而不是:

var lastProduct = Context.Products.FirstOrDefault().OrderByDescending(c => c.Id);

这样做:

var lastProduct = Context.Products.Add(newProduct);
Cache.Set("LastProduct", lastProduct, new CacheItemPolicy { SlidingExpiration = new TimeSpan(1, 0, 0, 0)});

这里有一些优点。首先,您每次点查询数据库以获取最后一个产品。第二,你不会在你的Poco课程中访问EF Context。

public class Product
{
    public Product()
    {
        // var lastProduct = (Product)Cache["LastProduct"];
        // Set default value here
    }
    public int Id { get; set; }
    public string Sku { get; set; }
    public int PriceId { get; private set; }

    public virtual Price Price { get; set; }
}