2017-02-24 12 views
3

私はDBの最初のアプローチを使用しますエンティティのフレームワークと継承

私は "注文"列(レコードのクライアント順)を持つ3つのテーブルを持っています。 .NETアプリケーションで並べ替えるために同様のロジックを作成したいので、基本クラスで作業したいと思います。

enter image description here

が、プロジェクトをコンパイルすることはできませんが、列の順序は、各3つのテーブルにマップされていないと私はそれをマッピングするための方法が表示されない:

enter image description here私は、次のような構造を作成しました

どのように言うと、そのOrder列は、親クラスOrderのプロパティにマップされるべきですか?

更新日:

をそうでなければ私のような同様の方法を作成する必要があります。

public interface IOrder 
{ 
    int Order { get; set; } 
} 

public partial class EscortDescription : IOrder 
{ 
} 

public partial class EscortGroup : IOrder 
{ 

} 

public partial class EscortItem : IOrder 
{ 

} 

    private async Task ReorderEscortAsync(Infrastructure.IOrder item1, Infrastructure.IOrder item2) 
    { 
     Random rnd = new Random(); 
     if (item1 == null) 
      throw new ArgumentNullException("firstItem"); 

     if (item2 == null) 
      throw new ArgumentNullException("secondItem"); 

     int tmpItem1Order = item1.Order; 
     int tmpItem2Order = item2.Order; 
     item1.Order = rnd.Next(int.MinValue, -1); 
     item2.Order = rnd.Next(int.MinValue, -1); 
     _db.SaveChanges(); 

     item1.Order = tmpItem2Order; 
     item2.Order = tmpItem1Order; 
     await _db.SaveChangesAsync(); 
    } 

    public async Task EscortGroupItemUpAsync(int ItemID) 
    { 
     var firstItem = (from i in _db.EscortItems where i.ID == ItemID select i).FirstOrDefault(); 
     if (firstItem == null) 
      throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortItems"); 
     var secondItem = (from i in _db.EscortItems where i.Order < firstItem.Order orderby i.Order descending select i).FirstOrDefault(); 

     if (secondItem != null) 
      await ReorderEscortAsync(firstItem, secondItem); 
     else 
      throw new FirstRecordException(); 
    } 

    public async Task EscortGroupItemDownAsync(int ItemID) 
    { 
     var secondItem = (from i in _db.EscortItems where i.ID == ItemID select i).FirstOrDefault(); 
     if (secondItem == null) 
      throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortItems"); 
     var firstItem = (from i in _db.EscortItems where i.Order > secondItem.Order orderby i.Order ascending select i).FirstOrDefault(); 

     if (firstItem != null) 
      await ReorderEscortAsync(firstItem, secondItem); 
     else 
      throw new LastRecordException(); 
    } 

    public async Task EscortGroupUpAsync(int ItemID) 
    { 
     var firstItem = (from i in _db.EscortGroups where i.ID == ItemID select i).FirstOrDefault(); 
     if (firstItem == null) 
      throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortGroups"); 
     var secondItem = (from i in _db.EscortGroups where i.Order < firstItem.Order orderby i.Order descending select i).FirstOrDefault(); 

     if (secondItem != null) 
      await ReorderEscortAsync(firstItem, secondItem); 
     else 
      throw new FirstRecordException(); 
    } 

    public async Task EscortGroupDownAsync(int ItemID) 
    { 
     var secondItem = (from i in _db.EscortGroups where i.ID == ItemID select i).FirstOrDefault(); 
     if (secondItem == null) 
      throw new Domain.RecordNotFoundException<int>(ItemID, "ID", "EscortGroups"); 
     var firstItem = (from i in _db.EscortGroups where i.Order > secondItem.Order orderby i.Order ascending select i).FirstOrDefault(); 

     if (firstItem != null) 
      await ReorderEscortAsync(firstItem, secondItem); 
     else 
      throw new LastRecordException(); 
    } 

を私は理解していれば私は1つの方法を持っていると

+0

私は相続のような気がするが、ここでは正しいアプローチではない。このコンテキストでのOrderの意味がシーケンスの順序である場合、各エンティティは独自のOrderプロパティを持つ必要があります。 –

+0

私はリオーダロジックを解体したくありません。私は具体的なクラスの代わりに基本クラスを再編成して渡す方法を1つ持っています。 –

+0

シンプルにすると複雑になりますが、可能ですが、エンティティフレームワークが解析できないことがあるので、このような論理。 –

答えて

1

をパラメータとして、基本クラスのオブジェクトを渡すしたいと思いますあなたはよく、OrderBaseのテーブルはありません。これは、これがコンクリート型テーブル(TPC)マッピングであることを意味します。 This linkは、コードファーストでは、TPCをマッピングするのが難しくないことを示しています。

データベースファーストとTPCは、一緒に素敵な演奏をしません。これを行うには、EDMXを編集する必要があります。

私はあなたのクラスの2つでそれをやった。

<EntitySetMapping Name="OrderBases"> 
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EcortGroup)"> 
     <MappingFragment StoreEntitySet="EcortGroup"> 
     <ScalarProperty Name="GroupName" ColumnName="GroupName" /> 
     <ScalarProperty Name="ID" ColumnName="ID" /> 
     </MappingFragment> 
    </EntityTypeMapping> 
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EscortItem)"> 
     <MappingFragment StoreEntitySet="EscortItem"> 
     <ScalarProperty Name="Escort" ColumnName="Escort" /> 
     <ScalarProperty Name="EcortGroup_ID" ColumnName="EcortGroup_ID" /> 
     <ScalarProperty Name="ID" ColumnName="ID" /> 
     </MappingFragment> 
    </EntityTypeMapping> 
    </EntitySetMapping> 

これは、列がどのプロパティにマッピングされるよう指示:現在、あなたのEDMXのCSマッピングコンテンツのセクションでは、このような何かを見つけることができます。ご覧のとおり、Orderがありません。もつとも

<EntityTypeMapping TypeName="IsTypeOf(TPCModel.EcortGroup)"> 
     <MappingFragment StoreEntitySet="EcortGroup"> 
     <ScalarProperty Name="GroupName" ColumnName="GroupName" /> 
     <ScalarProperty Name="ID" ColumnName="ID" /> 
     <ScalarProperty Name="Order" ColumnName="Order" /> 
     </MappingFragment> 
    </EntityTypeMapping> 
    <EntityTypeMapping TypeName="IsTypeOf(TPCModel.EscortItem)"> 
     <MappingFragment StoreEntitySet="EscortItem"> 
     <ScalarProperty Name="Escort" ColumnName="Escort" /> 
     <ScalarProperty Name="EcortGroup_ID" ColumnName="EcortGroup_ID" /> 
     <ScalarProperty Name="ID" ColumnName="ID" /> 
     <ScalarProperty Name="Order" ColumnName="Order" /> 
     </MappingFragment> 
    </EntityTypeMapping> 

:しかし、あなたはそれらを手動で追加することができ、およびEFが幸せになりますとEDMXはまだデザイナで開くことができますが、データベースからモデルを更新する場合、変更が消えてしまいます。これを行うたびに再度追加する必要があります。可能であれば、コードを最初に移植することを強くお勧めします。

+0

私はDBの最初の実装が必要です –

+0

これはあなたの唯一のオプションです。これはまだデータベースではあるが、ちょっとした助けが必要だということはあなたには明白だと思います。 –

関連する問題