实体框架 - 代码优先 - 将结果映射到未映射的属性

时间:2015-07-07 06:48:44

标签: c# asp.net-mvc entity-framework ef-code-first

我使用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传递给存储过程来获取所有产品。然后它将返回所有产品以及当前用户手中的总产品数量。

问题是EF没有将SP结果映射回NotMapped属性的产品实体。即,当我从SP返回其值时,产品实体中的所有属性都具有值,但NotMapped属性设置为NULL

我想问的是,EF是否支持这种功能?如果是,那么如何?

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

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

2 个答案:

答案 0 :(得分:1)

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

BTW考虑到ERPs,订单/ wms的模型通常是不同的。产品不包含有关QtyOnHand或销售/购买信息的信息。通常是包含此信息的另一个对象(Inventory?)。

答案 1 :(得分:0)

我将创建具有所有必需属性的产品的View Model,并将其传递给视图而不是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; }
        ...
    }

我希望有所帮助。