Entity Framework - 代码优先 - 将结果映射到未映射的属性
Entity Framework - Code First - Map results to Not Mapped properties
我使用 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
传递给存储过程来获取所有产品。然后它将 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; }
...
}
希望对您有所帮助。
我使用 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
传递给存储过程来获取所有产品。然后它将 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; }
...
}
希望对您有所帮助。