1

我应该缓存传入的数据。我有 2 个模型 OrderModel 和 OrderDetailedModel,其中 OrderModel 是一个基类,而 OrderDetailedModel 是一个子类。

用户首先打开一个订单列表 - 仅检索一些数据(订单模型列表)。这个列表应该被缓存。

当用户选择特定订单时,所有信息都在(OrderDetailedModel)中,这也应该被缓存。

重要的是,当再次下载列表时,我不希望缓存的 OrderDetailedModel 行被 OrderModel 覆盖。(不想清除详细信息)

我尝试创建 2 个不同的 DbSet:

public DbSet<OrderModel> Orders { get; set; }
public DbSet<OrderDetailedModel> OrderDetails { get; set; }


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<OrderDetailedModel>().Map(m =>
    {
        //m.MapInheritedProperties(); // this doesn't help either
        m.ToTable("OrderDetails");
    });

modelBuilder.Entity<OrderModel>().Map(m =>
        {
            //m.MapInheritedProperties();
            m.ToTable("Orders");
        });

}

但似乎它们仍然以某种方式联系在一起。这是每个 DbSet 的“内容”:

命令:

FROM  [Orders] AS [Extent1]
LEFT OUTER JOIN  (SELECT 
    [Extent2].[Id] AS [Id], 
    .....
    cast(1 as bit) AS [C1]
    FROM [OrderDetails] AS [Extent2] ) AS [Project1] ON [Extent1].[Id] = [Project1].[Id]}

订单详细信息:

{SELECT 
N'0X0X' AS [C1], 
[Extent1].[Id] AS [Id], 
... 
[Extent1].[StoreContact] AS [StoreContact], 
...
FROM  [OrderDetails] AS [Extent1]
INNER JOIN [Orders] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]}

这会导致错误:

var a = Entry<T>(detailedOrderObject);

“System.InvalidOperationException:当请求 OrderDetailedModel 类型的实体时,找到的实体属于 OrderModel 类型。

发生这种情况是因为详细订单与列表中下载的订单之一具有相同的 ID。(ID来自服务器)

去这里的正确方法是什么?

  • 2 个完全独立的桌子。这该怎么做?
  • 把所有东西都放在详细的订单表中。同样,如何做到这一点以避免覆盖我上面提到的?
  • 也许还有别的?

编辑

模特班:

public class OrderModel
    {
        [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
        [JsonProperty(PropertyName = "order_id")]
        public int Id { get; set; }

        [JsonProperty(PropertyName = "order_number")]
        public String Number { get; set; }

        //... only properties, like the one above

public class OrderDetailedModel :OrderModel
    {
        [JsonProperty(PropertyName="store_contact")]
        public string StoreContact { get; set; }

        //... only properties, like the one above
4

2 回答 2

1

您的类仍然是连接的,因为您的 OrderDetailedModel 类是从 OrderModel 派生的,并且 EF 在您查询表时会感到困惑。

话虽如此,我认为您绝对应该将它们分成 2 个单独的表,如果除了规范化数据库之外没有其他原因。要将其拆分,您需要在代码中包含 ForeignKey 属性,并停止从 OrderModel 派生 OrderDetailedModel 类。

假设 OrderModel : OrderDetailedModel 是 1:1,您将执行以下操作:

将此添加到 OrderModel:

public virtual OrderDetailedModel OrderDetails { get; set; }

并且对于您的 OrderDetailedModel 具有以下内容(任何其他注释,如 JsonProperty 也可以保留 - 我只是向您展示您需要拥有的 EF 注释):

public class OrderDetailedModel
{

  [Key, ForeignKey("Order")]
  public int OrderID { get; set; }

  //some properties

  public virtual OrderModel Order { get; set; }

}

让我知道它是如何工作的。

于 2013-01-07T20:21:54.283 回答
0

以防万一有人需要保持继承,我发布了我创建的解决方法:

public class OrderModel
{
    protected bool _detailed;

    [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(PropertyName = "order_id")]
    public int Id { get; set; }

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public bool Detailed
    {
        get { return _detailed; }
        set
        {
            if( (this.GetType() == typeof(OrderModel) && value== true) ||
                (this.GetType() == typeof(OrderDetailedModel) && value==false))
                throw new ArgumentException("This property is restricted");
            _detailed = value;
        }
    }

    //....

    public OrderModel()
    {
        _detailed = false;
    }
}


public class OrderDetailedModel :OrderModel
{
    //.....

    public OrderDetailedModel()
    {
        _detailed = true;
    }
}

它不漂亮,但有效。

于 2013-01-08T11:57:51.820 回答