Entity Framework - 代码优先 - 将结果映射到未映射的属性

Entity Framework - Code First - Map results to Not Mapped properties

我使用 Code First 在 EF 中创建了这些实体 ProductOrderOrderedItem

public class Product 
{
    public int Id { get; set; }
    public string Name { get; set; }

    [NotMapped]
    public int IssuedQuantity { get; set; }

    [NotMapped]
    public int InhandQuantity { get; set; }

    public virtual ICollection<OrderedItem> OrderedItems { get; set; }
    ...
}

public class Order
{
    public int Id { get; set; }
    public string ReferenceNumber { get; set; }

    public virtual ICollection<OrderedItem> OrderedItems { get; set; }
    ...
}

public class OrderedItem
{
    public int OrderId { get; set; }
    public string ProductId { get; set; }

    [ForeignKey("OrderId")]
    public virtual Order Order { get; set; }

    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
    ...
}

现在我想通过将当前 user id 传递给存储过程来获取所有产品。然后它将 return 所有产品以及当前在用户手中的产品总数。

问题是 EF 没有将 SP 结果映射回 NotMapped 属性的产品实体。即产品实体中的所有属性都有值,但 NotMapped 属性设置为 NULL 即使我 return 它们的值来自 SP。

我想问的是EF支持这种功能吗?如果是那么怎么办?

注意 我知道 Computed Properties 但这会在表中创建不必要的列,我不希望这样,因为这些属性是在 运行-时间。

注意 我知道我不需要创建 OrderedItem 实体。但我在其中存储了一些其他属性,为简洁起见,此处将其删除。

我很确定 EF 不支持动态映射(您可以尝试更改映射元数据,但这不是一种干净的方法,或者删除映射缓存,但 EF 会非常慢)。在这种情况下,理由是该实体是 2 个不同的实体,因为它们具有不同的数据。在你的情况下,最好的办法可能是做 2 个从 Product 继承的 ProductWithQuantities 实体。

顺便说一句,考虑到 ERP,orders/wms 的模型通常是不同的。产品不包含有关 QtyOnHand 或 sales/buy 信息的信息。通常是包含此信息的另一个对象(库存?)。

我会创建一个包含所有必需属性的产品视图模型,并将其传递给视图而不是产品模型。这样您就不会受到 Product 模型映射的限制,也不必在字段上使用 [NotMapped] 属性。

    [NotMapped]
    public class ProductVM 
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public int IssuedQuantity { get; set; }

        public int InhandQuantity { get; set; }

        public virtual ICollection<OrderedItem> OrderedItems { get; set; }
        ...
    }

希望对您有所帮助。