Как установить нулевой внешний ключ, обновив родительский объект в EF Core?C#

Место общения программистов C#
Ответить
Anonymous
 Как установить нулевой внешний ключ, обновив родительский объект в EF Core?

Сообщение Anonymous »

У меня есть два объекта с такой структурой:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»