我使用Code First在EF中创建了这些实体Product
,Order
,OrderedItem
。
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
实体。但是我在其中存储了一些其他属性,为简洁起见,这里删除了这些属性。
答案 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; }
...
}
我希望有所帮助。