asp.net mvc-理解实体框架中的虚拟属性和计算属性



我有一个作业模型,它包含许多属性和一组名为Quotes:的链接实体

public class Job
{
    ....
    public virtual ICollection<Quote> Quotes { get; set; }
}

在我的工作类中,我有以下计算属性:

public decimal QuotesAwarded
{
    get
    {
        if (Quotes == null || !Quotes.Any())
        {
            return 0;
        }
        var totalUnapprovedQuotes = Quotes.Where(x => x.Status != "Approved");
        return 1 - (totalUnapprovedQuotes.Count() / Quotes.Count());
    }
    set
    {
    }
}

我有两个问题:

  1. 调试此属性时,Quotes为null(即使此实体附有引号)。我认为使用virtual意味着不应该发生这种情况?我如何确保无论何时构建模型,都会附加相关的报价实体?

  2. 我这样做的原因是属性值存储在数据库中,因此它减少了预先计算的计算时间,这是正确的吗?

跟进:

在大多数情况下,检索作业对象时不使用Include<Quotes>。仅当我需要QuotesAwarded值时,我才使用Include。

但是,如果我不使用Include(比如db.jobs.find(id)),并且Quotes为null,那么QuotesAwarded的值将为0。所以当我保存作业对象时,它会被保存到数据库中,我在这里真的很困惑。

对于您的第一个问题,virtual关键字用于指示实体框架延迟加载它。但是,您似乎已经禁用了延迟加载,所以您总是需要.Include(...)它。由于您的属性依赖于正在加载的引号,它将始终返回0。

您所做的几乎是正确的,您只需要让EntityFramework知道您的属性是一个计算列。要做到这一点,您只需要用一个属性对其进行注释:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string QuotesAwarded
{
    get
    {
        if (Quotes == null || !Quotes.Any())
        {
            return 0;
        }
        var totalUnapprovedQuotes = Quotes.Where(x => x.Status != "Approved");
        return 1 - (totalUnapprovedQuotes.Count() / Quotes.Count());
    }
    private set
    {
        //Make this private so there's no temptation to set it
    }
}

相关内容

  • 没有找到相关文章

最新更新