コード ファースト (EF5) アプローチを使用してドメイン クラスを作成しています。クエリを実行して、子のコレクションを含む親レコードを取得します。親を編集し、子に対して CRUD 操作を実行する必要があります。
オブジェクト (親/子) を保存するときに、エンティティの状態が分離されているため、オブジェクトが変更、削除、または挿入された場合に追加のロジックを追加する必要がないという問題。
EF でエンティティの追跡を継続したり、エンティティを切り離したりしないようにするにはどうすればよいですか?
これが私のコードです:
public class myDbContext : DbContext
{
#region ConnectionStrings
public myDbContext()
: base(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ActiveDB_my"]].ToString())
{
this.Configuration.LazyLoadingEnabled = true;
Database.SetInitializer<myDbContext>(null);
//this.Configuration.ProxyCreationEnabled = true;
//this.Configuration.AutoDetectChangesEnabled = true;
}
#endregion
#region EntityFramework
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Entity Framework Configurations
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//Load Entity Configurations
dbomyAnotations.Load(ref modelBuilder);
base.OnModelCreating(modelBuilder);
}
#endregion
#region EntityRegistrations
//Client
public DbSet<ClientLocation> ClientLocations { get; set; }
//Templates
public DbSet<Template> Templates { get; set; }
#endregion
}
namespace App.myTrak.BL
{
public class Templates
{
public static ClientLocation getTemplatesForClientLocation(int clientLocationId)
{
ClientLocation entity = null;
using (myDbContext db = new myDbContext())
{
entity = db.ClientLocations
.Where(c => c.ClientLocationId == clientLocationId)
.Include(t => t.Templates)
.FirstOrDefault();
}
return entity;
}
public static void saveForTemplates(ClientLocation clientLocations)
{
int Id = clientLocations.ClientLocationId;
var db = new myDbContext();
//Client Location
db.ClientLocations.Attach(clientLocations);
db.Entry(clientLocations).State = System.Data.EntityState.Unchanged;
db.Entry(clientLocations).Property(x => x.ShowPresoldProducts).IsModified = true;
//App Templates
foreach (var template in clientLocations.Templates)
{
db.Templates.Attach(template);
db.Entry(template).State = System.Data.EntityState.Unchanged;
if (template.DeleteDate != null)
{
db.Entry(template).Property(x => x.DeleteUserId).IsModified = true;
db.Entry(template).Property(x => x.DeleteDate).IsModified = true;
template.DeleteDate = Shared.Common.DateTimeUTC();
}
else if (template.TemplateId == 0)
db.Entry(template).State = System.Data.EntityState.Added;
else
{
//Modified
db.Entry(template).Property(x => x.TemplateName).IsModified = true;
db.Entry(template).Property(x => x.Description).IsModified = true;
db.Entry(template).Property(x => x.AppTypeId).IsModified = true;
db.Entry(template).Property(x => x.ModifyUserId).IsModified = true;
db.Entry(template).Property(x => x.ModifyDate).IsModified = true;
template.ModifyDate = Shared.Common.DateTimeUTC();
template.ModifyUserId = CurrentUserId;
}
}
db.SaveChanges();
db.Database.Connection.Close();
}
}
}