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
?
非常感谢任何帮助。感谢
答案 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; }
}