شروع به کار با EF Core 1.0 - قسمت 13 - بررسی سیستم ردیابی تغییرات
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۶/۱۳ ۱۵:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Add(blog);
db.SaveChanges();
} using (var db = new BloggingContext())
{
var blog = db.Blogs.First();
blog.Url = "http://sample.com/blog";
db.SaveChanges();
} using (var db = new BloggingContext())
{
var blog = db.Blogs.First();
db.Blogs.Remove(blog);
db.SaveChanges();
} using (var context = new BloggingContext())
{
var blog = context.Blogs
.Select(b =>
new
{
Blog = b,
Posts = b.Posts.Count()
});
} using (var context = new BloggingContext())
{
var blog = context.Blogs
.Select(b =>
new
{
Id = b.BlogId,
Url = b.Url
});
} using (var context = new BloggingContext())
{
var blogs = context.Blogs.AsNoTracking().ToList();
} using (var context = new BloggingContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; using (var context = new BloggingContext())
{
var blog = context.Blogs.First();
var post = new Post { Title = "Intro to EF Core" };
blog.Posts.Add(post);
context.SaveChanges();
} using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
var post = context.Posts.First();
blog.Posts.Add(post);
context.SaveChanges();
} var blog = new Blog { Id = 2, Url = "https://www.dntips.ir" };
context.Blog.Attach(blog);
context.SaveChanges(); var blog = new Blog { Id = 2, Url = "https://www.dntips.ir" };
context.Entry(blog).State = EntityState.Modified ;
context.SaveChanges(); var blog = new Blog { Id = 2, Url = "https://www.dntips.ir" };
context.Update(blog);
context.SaveChanges(); context.ChangeTracker.TrackGraph(blog, e => e.Entry.State = EntityState.Added);
public class BaseEntity
{
public int Id { set; get; }
public DateTime? DateAdded { set; get; }
public DateTime? DateUpdated { set; get; }
} public class Person : BaseEntity
{
public string FirstName { get; set; }
public string LastName { get; set; }
} public class ApplicationDbContext : DbContext
{
// same as before
public override int SaveChanges()
{
this.ChangeTracker.DetectChanges();
var modifiedEntries = this.ChangeTracker
.Entries<BaseEntity>()
.Where(x => x.State == EntityState.Modified);
foreach (var modifiedEntry in modifiedEntries)
{
modifiedEntry.Entity.DateUpdated = DateTime.UtcNow;
}
var addedEntries = this.ChangeTracker
.Entries<BaseEntity>()
.Where(x => x.State == EntityState.Added);
foreach (var addedEntry in addedEntries)
{
addedEntry.Entity.DateAdded = DateTime.UtcNow;
}
return base.SaveChanges();
}
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property<DateTime>("DateAdded"); var blogs = context.Blogs.OrderBy(b => EF.Property<DateTime>(b, "DateAdded"));
context.Entry(myBlog).Property("DateAdded").CurrentValue = DateTime.Now; foreach (var addedEntry in addedEntries)
{
addedEntry.Property("DateAdded").CurrentValue = DateTime.UtcNow;
} var items = (from p in context.Categories
select new
{
Id = p.Id,
Name = p.Name,
DateAdded = EF.Property<DateTime>(p, "DateAdded")
}).ToList(); var cList = context.Categories
.OrderBy(b => EF.Property<DateTime>(b, "DateAdded")).ToList();
foreach (var cat in cList)
{
Console.Write("Category Name: " + cat.CategoryName);
Console.WriteLine(" Created: " + context.Entry(cat).Property("DateAdded").CurrentValue);
} public static class ShadowProperty
{
public static readonly string CreatedAt = nameof(CreatedAt);
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class StudentDto
{
public int Id { get; set; }
public string Name { get; set; }
public DateTimeOffset Created { get; set; }
}
public class StudentMappingProfile : Profile
{
public StudentMappingProfile()
{
CreateMap<Student, StudentDto>()
.ForMember(
dest => dest.Created,
opt => opt.MapFrom(src => EF.Property<DateTimeOffset>(src, ShadowProperty.CreatedAt))
);
}
} var students = context.Students.ProjectTo<StudentDto>(configuration: mapper.ConfigurationProvider).ToList();
public IActionResult OnPost(int id)
{
var categoryToDelete = _categoryService.GetForDelete(id);
if (categoryToDelete is null)
return BadRequest();
_categoryService.Remove(id); // Not works! => First overload
_dbContext.SaveChanges();
return RedirectToPage("Index");
} public void Remove(int id)
{
var category = new Category() { Id = id };
_context.Entry(category).State = EntityState.Deleted;
}
public void Remove(Category value)
=> _context.Remove(value); public class AuditableEntitiesInterceptor : SaveChangesInterceptor
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger<AuditableEntitiesInterceptor> _logger;
public AuditableEntitiesInterceptor(
IHttpContextAccessor httpContextAccessor,
ILogger<AuditableEntitiesInterceptor> logger)
{
_httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public override InterceptionResult<int> SavingChanges(
DbContextEventData eventData,
InterceptionResult<int> result)
{
if (eventData == null)
{
throw new ArgumentNullException(nameof(eventData));
}
BeforeSaveTriggers(eventData.Context);
return result;
}
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(
DbContextEventData eventData,
InterceptionResult<int> result,
CancellationToken cancellationToken = default)
{
if (eventData == null)
{
throw new ArgumentNullException(nameof(eventData));
}
BeforeSaveTriggers(eventData.Context);
return ValueTask.FromResult(result);
}
private void BeforeSaveTriggers(DbContext? context)
{
// ValidateEntities(context);
// ApplyAudits(context?.ChangeTracker);
}
} services.AddSingleton<AuditableEntitiesInterceptor>();
services.AddDbContextPool<ApplicationDbContext>((serviceProvider, optionsBuilder) =>
optionsBuilder
.UseSqlServer(connectionString)
.AddInterceptors(serviceProvider.GetRequiredService<AuditableEntitiesInterceptor>()));