C# 使用具有附加属性的实体框架

C# 使用具有附加属性的实体框架,c#,entity-framework,C#,Entity Framework,我有两个表,一个名为Products,另一个名为Samples,带有产品的外键。 一个样本仅仅由一个十进制值和一个时间戳组成。 一个产品有一个名字,就是它。但是我希望价格(十进制)与产品相关联。价格应为样本中的最新样本 我对使用实体框架很感兴趣,但是当产品实体不直接在表中并且需要事先执行一些“计算”时,如何实现具有价格值的产品实体?有一个名为NotMapped的属性,它可以让您创建一个没有映射到数据库的属性。先编写代码,这样应该可以: public class Product { pub

我有两个表,一个名为Products,另一个名为Samples,带有产品的外键。 一个样本仅仅由一个十进制值和一个时间戳组成。 一个产品有一个名字,就是它。但是我希望价格(十进制)与产品相关联。价格应为样本中的最新样本


我对使用实体框架很感兴趣,但是当产品实体不直接在表中并且需要事先执行一些“计算”时,如何实现具有价格值的产品实体?

有一个名为NotMapped的属性,它可以让您创建一个没有映射到数据库的属性。先编写代码,这样应该可以:

public class Product
{
    public int Id { get; set; }
    public virtual IEnumerable<Sample> Samples { get; set; }
    [NotMapped]
    public decimal Price
    {
        get { return Samples.OrderByDescending(x => x.TimeStamp).First().Price; }
    }
}

public class Sample
{
    public int Id {get; set;}
    public decimal Price { get; set; }
    [Timestamp]
    public byte[] TimeStamp {get; set;}
}
公共类产品
{
公共int Id{get;set;}
公共虚拟IEnumerable示例{get;set;}
[未映射]
公共十进制价格
{
获取{return Samples.OrderByDescending(x=>x.TimeStamp).First().Price;}
}
}
公共类样本
{
公共int Id{get;set;}
公共十进制价格{get;set;}
[时间戳]
公共字节[]时间戳{get;set;}
}

如果不是先编写代码,EF为您构建的类是分部类,因此您可以轻松地对其进行类似的扩展。

您可以为示例创建分部类并添加所需的任何属性。那么我将如何/在何处实例化该属性?或者,如果您使用Fluent API而不是属性进行配置,您可以使用
Ignore
方法。但是查询不会在内存中完成,也不会在sql数据库中完成吗?我需要很好的性能,因为我有大量的数据,所以我不能忽视performance@Peter由于
Samples
标记为virtual,因此它是延迟加载的。因此,只要您有
产品
,您就已经有了相关的
样本
Price
属性只返回该集合中的最新样本,而不是DB。哦,太好了。当我第一次做db时,我需要做一些不同的事情吗?当我尝试使用[notmapped]道具在我的产品上迭代时,它的速度比不使用它时慢。只是让我nervous@Peter是
ICollection
还是
ICollection
?我希望这是第二个提供了
OrderBy
。如果是第一个,您可以通过执行
ICollection.cast()
将其转换为泛型类型,然后使用
OrderBy
。检查有关铸造的答案。