私はEntity Framework 4.3を使用しています(EFが必要なことを実行できない場合は、これを変更することについて提案を受け付けています)。
いくつかのエンティティ/ビジネス オブジェクトがあります。これらのオブジェクトは変更してはならず、注釈を付けてはならず (DataAnnotation 属性はありません)、回避策として内部メンバーを追加してはなりません。また、データベースも石のように設定されているか、私の制御を超えています。つまり、DB は変更できず、エンティティも変更できません。これは、最初は、Fluent API を使用する完全な理由のように思えました。
public class MyEntity
{
public int MyEntityId { get; set; }
public string Name { get; set; }
public bool IsGreen { get; set; }
}
このオブジェクトが関連するデータベース内のテーブルが次のようになっているとします。
CREATE TABLE [dbo].[MyEntities]
(
MyEntityId INT NOT NULL,
Name VARCHAR(30) NOT NULL,
IsGreen CHAR(1) NOT NULL,
ForeignKeyId INT NULL
)
SQL が間違っている場合はお詫びします。手早く入力してください。
うまくいけば、すぐにいくつかの競合に気付くでしょう。
質問 1) Fluent APIを使用して、元のエンティティに回避策のプロパティを追加せずにブール値をIsGreen CHAR(1) NOT NULLフィールドにマップすることは可能ですか? この列は null 可能ではありません。bool を設定する式は次のようになります。
x => new MyEntity() { IsGreen = x.IsGreen == "Y" }
質問 2) マップされていない列が null 可能であり、外部キーがある場合でも、すべての列がマップされているわけではありませんが、MyEntity をデータベースに挿入できますか?
質問 3) EF が上記を実行できない場合、できるフレームワークはありますか?
これが私がこれまでに試したことです:
試行 1 : DB スキーマに基づいて 個別のエンティティを作成し、長い式を作成して一方から他方に変換できるようにする道を歩み始めました。
これは最終的には機能した可能性がありますが、かかるばかげた時間を無視すると、新しい問題が発生しました。where句のExpression<Func<MyEntity, bool>>
式は明らかにDBに適用できなくなり、代わりにすべてのレコードを戻し、式をコンパイルし、結果の列挙型に適用する必要がありました。
残念ながら、これでは十分ではありません。戻されるデータが多すぎます。MemberAccess
式をたどってノードを新しいエンティティにマップするコードを書くのに時間を費やすこともできましたが、それは不必要に複雑に思えました。
試行 2 :
次に、回避策のプロパティを含む可能性のある継承クラスを作成して、セッターに実際のプロパティを設定しようとしましたが、実際のプロパティは流暢な API を介して無視されました。継承のおかげで、前述の where 式が機能するはずでした。
ただし、継承は EF によって発見され、期待していたエンティティの継承階層とスキーマが一致しないため、データベースにクエリを実行できなくなりました。(少しあいまいですが、EF の TPH/TPT/etc の側面と、それが必ずしも私のスキーマと一致していないことを考慮してください。これは私の最も近い試みだったと思いますが、問題を修正する方法がわかりませんでした流れるような API)。
試行 3 : 最後に、デザイナーをいじってみました。私がもうデザイナーをいじっていないことを除いて、それについてはあまり言うことはありません.
注意: このソフトウェアは、いくつかの異なるデータベースに対して実行する必要があります。これらのデータベースは毎回まったく同じスキーマを持っているわけではありません。そのため、たとえば、モデルに存在する各列のプロパティが必ずしも存在しない場合でも、コードが機能する必要があります。 DBで。それだけでなく、ソフトウェアが出荷される前に、データベースに追加の列がいくつあるか、またはどのような列があるかはわかりません。私が知っているのは、列がnull可能であることだけです。したがって、テーブルに挿入できるはずですコアの非 null 列 (MyEntity オブジェクトに存在する列)。これだけで、デザイナーは除外されると思います。
テキストの壁で申し訳ありません-助けていただければ幸いです!