モデル#1-このモデルは、DevServerのデータベースにあります。 モデル#1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png
モデル#2-このモデルはProd Serverのデータベースにあり、自動フィードによって毎日更新されます。 代替テキストhttp://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png
フィード(モデル#2)を作業中のDB(モデル#1)に同期するための簡単なコードを記述しました。これはプロトタイプコードであり、モデルが思ったほどきれいではない可能性があることに注意してください。また、フィードリンクデータ(主にClientID)のモデル#1への入力は、この時点では手動プロセスであるため、この単純な同期メソッドを作成しています。
private void SyncFeeds()
{
var sourceList = from a in _dbFeed.Auto where a.Active == true select a;
foreach (RivWorks.Model.NegotiationAutos.Auto source in sourceList)
{
var targetList = from a in _dbRiv.Product where a.alternateProductID == source.AutoID select a;
if (targetList.Count() > 0)
{
// UPDATE...
try
{
var product = targetList.First();
product.alternateProductID = source.AutoID;
product.isFromFeed = true;
product.isDeleted = false;
product.SKU = source.StockNumber;
_dbRiv.SaveChanges();
}
catch (Exception ex)
{
string m = ex.Message;
}
}
else
{
// INSERT...
try
{
long clientID = source.Client.ClientID;
var companyDetail = (from a in _dbRiv.AutoNegotiationDetails where a.ClientID == clientID select a).First();
var company = companyDetail.Company;
switch (companyDetail.FeedSourceTable.ToUpper())
{
case "AUTO":
var product = new RivWorks.Model.Negotiation.Product();
product.alternateProductID = source.AutoID;
product.isFromFeed = true;
product.isDeleted = false;
product.SKU = source.StockNumber;
company.Product.Add(product);
break;
}
_dbRiv.SaveChanges();
}
catch (Exception ex)
{
string m = ex.Message;
}
}
}
}
今質問のために:
- モデル#2では、Autoのクラス構造にClientIDがありません(赤い丸で囲まれた領域を参照)。これで、私が学んだことはすべて、EFがClientの子クラスを作成し、子クラスでClientIDを見つけることができるはずです。それでも、コードを実行すると、source.ClientはNULLオブジェクトになります。EFがやらないことを期待していますか?子クラスを正しく設定する方法はありますか?
- EFが親テーブルの子エンティティID(この場合はClientID)を非表示にするのはなぜですか?それを公開する方法はありますか?
- ことわざの親指の痛みのように他に何が突き出ていますか?
TIA