【问题标题】:Entity Framework - Code First - Map results to Not Mapped properties实体框架 - 代码优先 - 将结果映射到未映射的属性
【发布时间】:2015-07-08 03:43:11
【问题描述】:

我使用 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 属性的 Product 实体。即产品实体中的所有属性都有值,但NotMapped 属性设置为NULL,即使我从 SP 返回它们的值。

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

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

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

【问题讨论】:

  • 如果添加 NotMapped 属性,则不会映射该属性。您可以设计Product 类来映射表Product 并设计UserProduct 继承Product 来映射SP 结果

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我将创建具有所有必需属性的产品视图模型,并将其传递给视图而不是产品模型。这样您就不会受到 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; }
            ...
        }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 2011-08-06
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多