Insert and delete complex structure
I have the following classes that represent tables:
public class PriceDefinition
{
public virtual long Id{get;set;}
public virtual IList<Rule> Rules{get; set;}
public virtual IList<PriceDefinitionAddition> Additions{get; set;}
public virtual IList<CustomerPrice> CustomersPrices { get; set; }
public PriceDefinition() { }
}
public class Rule
{
public virtual long PriceDefinitionId { get; set; }
public virtual string FieldName { get; set; }
public virtual string Values { get; set; }
public virtual string Text { get; set; }
public Rule() { }
}
public class CustomerPrice
{
public virtual long Id { get; set; }
public virtual long CustomerId { get; set; }
public virtual long PriceDefinitionId { get; set; }
public virtual long TaskPriceId { get; set; }
public virtual Price TaskPrice { get; set; }
public virtual IList<CustomerAdditionPrice> AdditionsPrices { get; set; }
public CustomerPrice() { }
}
public class CustomerAdditionPrice
{
public virtual long CustomerPriceId { get; set; }
public virtual long AdditionId { get; set; }
public virtual long PriceId { get; set; }
public virtual Price Price { get; set; }
public CustomerAdditionPrice() { }
}
public class Price
{
public virtual long Id { get; set; }
public virtual decimal PriceSum { get; set; }
public virtual decimal PricePercent { get; set; }
public virtual long? UnitTypeId { get; set; }
public virtual UnitTypeWrapper UnitTypeWrapper { get; set; }
public UnitTypeEnum UnitType { get { return UnitTypeWrapper; } }
public Price() { }
}
public class PriceDefinitionAddition
{
public virtual long PriceDefinition开发者_如何转开发Id { get; set; }
public virtual long AdditionId { get; set; }
public PriceDefinitionAddition() { }
}
I have an id of PriceDefinition and I have to delete all the related data. Do I have to iterate over all this complicated structure? How can I use include then load the object in order to load the entire structure? Is there any simple way to delete all this structure?
I have PriceDefinition object and I have to insert in including all its related data. How can I do it in a way that when I call SaveChanges all the id's will get apropriate values? Do I have to iterate all the elements in order to insert all of them?
To solve deletion - use cascade deletes in both database and Entity designer. If you don't use cascade deletes you must indeed load the whole structure to your application and delete entities one by one.
To solve insertion - prepare your new entity with all new related entities and simply use AddObject
on the main entity. It will also adds all related entities not tracked by the context. If your Ids are generated by database and correctly set with StoreGeneratedPattern.Identity in your entity designer you don't have to do anything more.
Edit:
Another way is simply use stored procedure to delete the structure if it is too complex because loading the structure and deleting entities one by one (= one DB round trip for each delete) can be very slow.
精彩评论