1

受信データをキャッシュすることになっています。OrderModel と OrderDetailedModel の 2 つのモデルがあります。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 型でした。

これは、詳細な注文が、リストにダウンロードされた注文の 1 つと同じ 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 属性をコードに含め、OrderDetailedModel クラスが OrderModel から派生するのをやめる必要があります。

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 に答える