0

コード ファースト (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();
        }
    }
}
4

0 に答える 0