0

int PK、1つのNOT NULLフィールド、および2つのNULL文字列フィールドを持つテーブルがあります。

EFでTPHスタイルのデザインを設定するときは、次のように設定します。

トップレベルタイプには、PKフィールドとNOTNULLフィールドのみがあります。

最初のレベルは、最初のnull許容フィールドをディスクリミネーターとしてチェックします。nullではない結果の型は抽象です。それに応じてフィールドをマッピングします。

2番目のフィールドに対してこれを再度実行し、nullでない場所に再度マッピングします。マップするフィールドにnullable=falseを設定しました。

<EntitySetMapping Name="Items">
        <EntityTypeMapping TypeName="IsTypeOf(Model1.Item)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name="OtherID" ColumnName="OtherID" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.BothNullItem)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="FirstNullField" IsNull="true" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.FirstFieldNull)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name=FirstNullField" ColumnName="FirstNullField" />
            <Condition ColumnName="FirstNullField" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem1)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem2)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
             <ScalarProperty Name="NullField2" ColumnName="NullField2" />
             <Condition ColumnName="NullField2" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
</EntitySetMapping>

「異なるキーを持つ2つのエンティティが同じ行にマップされています」というメッセージが表示されます。

最初のアイテムのnullではない属性が子に継承されていないためだと思います。

NullField1がnullでNullField2がnullでない場合に対処するために3番目のタイプを作成しました(これは私のDBでは発生しません、制約があります)が、追加しても機能しません。

2つのサブ子のいずれかにnull以外の条件を明示的に追加するには、列をマップする必要があります。これは、外部のプロパティにマップしても機能しません。

「BothNullItem」の条件の組み合わせも機能しません。

何か案は?

4

1 に答える 1

0

ウェルプ、識別子列を継承によって伝播することをあきらめてしまったので、3 つのビューを作成しました。1 つはトップレベル、もう 1 つは null フィールド 1 用で、1 つは null フィールド 1 ではなく、null フィールド 1 ではありません。 EF の列。これは私の問題に対するくだらない答えのように聞こえるので、取引が何であるかを知っている誰かから聞きたい. ビューラー?

更新: 修正済み! msdn (http://msdn.microsoft.com/en-us/library/cc716779.aspx) で見つけた記事の 1 つで、水平分割の概念から外れて、手動で msl に条件を追加しました。デザイナーから自動的にこの作業を行うことはできないようです。疑問に思っている方のために、xml エディターで edmx を開き、下に移動して、マッピングの条件要素を確認してください。必要に応じて追加の条件を追加し (明らかに条件は親エンティティから継承されないため、子エンティティに手動で追加する必要があります)、コンパイルします!

于 2011-06-11T02:51:41.950 に答える