Я использую EF Code First, и ленивая загрузка.
Моя проблема связана с тем, как эффективно обновить сущность в коллекции внуков. Прежде всего, я боюсь, что это делает много вызовов в БД, которые на самом деле не нужны. Но если мой класс домена не заботится о сохранности, я не могу найти другой способ сделать это.
Вот классы:
public class Supplier
{
public int Id {get;set;}
//...Supplier properties
public virtual ICollection<Contract> Contracts {get;set;}
//supplier methods
}
public class Contract
{
public int id {get;set;}
public int SupplierId{get;set;}
//---Contract properties
[ForeignKey("SupplierId")]
public virtual Supplier Supplier {get;set;}
public virtual ICollection<DeliveryContract> DeliveryContracts {get;set;}
}
public class DeliveryContract
{
public int Id {get;set;}
public bool DeliveryOnMonday{get;set;}
public bool DeliveryOnTuesday{get;set}
//...30 different Delivery terms properties
public Department Department {get;set;}
public int ContractId {get;set;}
[ForeignKey("ContractId")
public virtual Contract Contract {get;set;}
}
Поставщик - совокупный Корень. Итак, у меня есть метод поставщика, который называется ChangeDeliveryContract, и это соответствует тому, что произошло бы в реальном мире.
public class Supplier
{
//properties
public void ChangeDeliveryContract (DeliveryContract cahangedDc)
{
//So from the supplier i have to find the contract to change
var dcToUpdate = Contracts
.SingleOrDefault(c=>c.Id == changedDc.ContractId)
.SingleOrDefalut(dc=>dc.Id == changedDc.Id);
//So... what do i do now? Map all 30 properties from changedDc to DcToUpdate
//Some business rules is also applied here i.e. there can only be one
// DeliveryContract between Supplier and Department
}
}
Я использую MVC, чтобы программа выглядела примерно так:
общедоступное обновление ActionResult (DeliveryContract updatedDc, int supplierId)
{
var Supplier = supplierRepository.GetById(supplierid);
supplier ChangeDeliveryContract (changedDc);
supplierRepository.Save();
//More code...
}
Прежде всего, проблема заключается в контракте ChangeDelivery. Я не смог заставить это работать. Кроме того, я чувствую, что запросы к коллекциям могут быть неэффективными. В-третьих, отображение свойств 30+ также кажется немного неправильным.
Как вы, ребята, делаете это, и есть ли здесь лучшие практики.