アップデート:
これは今私を夢中にさせています!
多くのグーグルなどの後、私は本当に解決策に近づいていません.....
ただし、さらに困惑していることが1つあります。それは、m_dbContext.SaveChanges()呼び出しの直前のエンティティの「状態」です。(完全なリポジトリコードについては、以下を参照してください)
var updateInfoState = m_dc.Entry(oldPage.UpdateInfo).State; // State is 'Modified'
var oldPageState = m_dc.Entry(oldPage).State; // State is 'Detached'
this.m_dc.SaveChanges();
「oldPage」が切り離されるのはなぜですか?
今はかなり必死になっています!! ;)
オリジナル:
EFコードに問題があるようです-最初に関連するテーブルを正しく更新します。
この簡略化された例では、「UpdateInfo」テーブルは新しいDateTimeで正常に更新されていますが、「Pages」テーブルは新しい「Name」値で更新されていません。
私はDropCreateDatabaseAlwaysを介してコードファーストPOCOをシードしています/Seedをオーバーライドします...そしてEFはテストテーブルを正しく作成しています-したがって、この時点でそれが何をしているのかを知っているようです...。
これは私が見逃している単純で明白なものだと確信しています!
すべてが非常に感謝しています!
私のクラスの定義:
public class Page
{
public int Id { get; set; }
public string Name { get; set; }
public virtual UpdateInfo UpdateInfo { get; set; } // virtual For Lazy loading
}
[Table("UpdateInfo")] // much better than EF's choice of UpdateInfoes!
public class UpdateInfo
{
public int Id { get; set; }
public DateTime DateUpdated { get; set; }
}
public class DomainContext : DbContext
{
public DbSet<Page> Pages { get; set; }
public DbSet<UpdateInfo> UpdateInfo { get; set; }
}
Code-Firstによって作成されたテーブル
Pages Table
===========
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[UpdateInfo_Id] [int] NULL,
UpdateInfo Table
================
[Id] [int] IDENTITY(1,1) NOT NULL,
[DateUpdated] [datetime] NOT NULL,
私のリポジトリコード:
public Page Get(int id)
{
Page page = m_dbContext.Pages.Single(p => p.Id == id);
return page;
}
public void Update(PagePostModel model)
{
Page oldPage = Get(model.PageModel.Id); // on oldPage Name = "Hello", DateUpdated = "Last Year"
Page newPage = Mapper.Map<PageModel, Page>(model.PageModel); // on newPage Name = "Goodbye" (AutoMapper)
newPage.UpdateInfo = oldPage.UpdateInfo; // take a copy of the old UpdateInfo since its not contained in the model
newPage.UpdateInfo.DateUpdated = DateTime.UtcNow; // update to now
oldPage = newPage; // copy the updated page we grabbed from dbContext above (NB Everything looks great here..oldPage is as expected)
m_dbContext.SaveChanges(); // update - only the 'UpdateInfo' table is being updated - No change to 'Pages' table :(((
}