Код: Выделить всё
public abstract class BaseEntity
{
public BaseEntity()
{
//Validate();
}
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; protected set; } = DateTime.Now;
public bool IsDeleted { get; protected set; }
public DateTime? DeletedAt { get; protected set; }
public DateTime? ModifiedAt { get; set; }
public void SetAsDeleted()
{
DeletedAt = DateTime.Now;
IsDeleted = true;
}
protected abstract void Validate();
}
public class Order : BaseEntity
{
public Person Owner { get; set; }
public long TotalPrice { get; set; }
protected override void Validate()
{
}
}
public class Person : BaseEntity
{
protected Person()
{
Orders = new List();
}
public Person(string name, string family)
{
Name = name;
Family = family;
Orders = new List();
}
public void AddOrder(Order order)
{
Orders.Add(order);
}
public void RemoveOrder(Guid id)
{
var item = Orders.FirstOrDefault(x => x.Id == id);
if (item != null)
Orders.Remove(item);
}
protected override void Validate()
{
}
public string Name { get; set; }
public string Family { get; set; }
//private List _orders;
//public IReadOnlyCollection Orders => _orders.AsReadOnly();
public List Orders { get; set; }
}
Код: Выделить всё
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity()
.HasMany(x => x.Orders)
.WithOne(o => o.Owner)
//.OnDelete(DeleteBehavior.SetNull)
.HasForeignKey("OwnerId")
.Metadata.DependentToPrincipal?.SetPropertyAccessMode(PropertyAccessMode.Field);
}
Код: Выделить всё
public class GenericRepository : IGenericRepository where T : BaseEntity where C : DbContext
{
protected ILogger Logger;
protected readonly C DbContext;
public GenericRepository(C dbContext, ILogger logger)
{
DbContext = dbContext;
Logger = logger;
}
protected IDbConnection DataBaseConnection => DbContext.Database.GetDbConnection();
public virtual async Task SoftDeleteAsync(Guid id)
{
var item = await DbContext.Set().FirstOrDefaultAsync(x => x.Id == id);
item.SetAsDeleted();
await DbContext.SaveChangesAsync();
}
public virtual async Task AddAsync(T entity)
{
await DbContext.Set().AddAsync(entity);
await DbContext.SaveChangesAsync();
}
public virtual async Task UpdateAsync(T entity)
{
DbContext.Attach(entity);
DbContext.Entry(entity).State = EntityState.Modified;
await DbContext.SaveChangesAsync();
}
public virtual async Task GetByIdAsync(Guid id, bool asNoTracking = true)
{
var query = DbContext.Set().AsQueryable();
if (asNoTracking)
query = query.AsNoTracking();
return await query.FirstOrDefaultAsync(x => x.Id == id);
}
public virtual async Task QueryAsync(Expression predict, bool asNoTracking = true)
{
var query = DbContext.Set().Where(predict);
if (asNoTracking)
{
query = query.AsNoTracking();
}
return await query.ToListAsync();
}
}
Код: Выделить всё
Person person = new Person("unknown", "person");
person.AddOrder(new Order
{
TotalPrice = 200
});
person.AddOrder(new Order
{
TotalPrice = 300
});
person.AddOrder(new Order
{
TotalPrice = 400
});
await _personRepository.AddAsync(person);
return Ok(person.Id);
Теперь я хотел бы отделить первый заказ от человека . Это означает, что я хочу установить для OwnerId значение null (не удаляя всю строку из таблицы заказов).
Это мой код:
Код: Выделить всё
var person = await _personRepository.GetByIdAsync(id);
person.RemoveOrder(orderid);
await _personRepository.UpdateAsync(person);
return Ok(person.Id);
Подробнее здесь: https://stackoverflow.com/questions/785 ... in-ef-core
Мобильная версия