Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入和删除复杂结构_C#_.net_Entity Framework - Fatal编程技术网

C# 插入和删除复杂结构

C# 插入和删除复杂结构,c#,.net,entity-framework,C#,.net,Entity Framework,我有以下表示表的类: 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 I

我有以下表示表的类:

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 PriceDefinitionId { get; set; }
    public virtual long AdditionId { get; set; }

    public PriceDefinitionAddition() { }
}
公共类价格定义
{
公共虚拟长Id{get;set;}
公共虚拟IList规则{get;set;}
公共虚拟IList添加{get;set;}
公共虚拟IList CustomerPrices{get;set;}
公共价格定义(){}
}
公共阶级规则
{
公共虚拟长价格定义ID{get;set;}
公共虚拟字符串字段名{get;set;}
公共虚拟字符串值{get;set;}
公共虚拟字符串文本{get;set;}
公共规则(){}
}
公共类客户价格
{
公共虚拟长Id{get;set;}
公共虚拟长客户ID{get;set;}
公共虚拟长价格定义ID{get;set;}
公共虚拟长TaskPriceId{get;set;}
公共虚拟价格任务价格{get;set;}
公共虚拟IList AdditionsPrices{get;set;}
公共客户价格(){}
}
公共类CustomerAdditionPrice
{
公共虚拟长CustomerPriceId{get;set;}
公共虚拟长附加ID{get;set;}
公共虚拟长PriceId{get;set;}
公共虚拟价格{get;set;}
公共CustomerAdditionPrice(){}
}
公共类价格
{
公共虚拟长Id{get;set;}
公共虚拟十进制价格和{get;set;}
公共虚拟十进制价格百分比{get;set;}
公共虚拟长?UnitTypeId{get;set;}
公共虚拟UnitTypeWrapper UnitTypeWrapper{get;set;}
public UnitTypeEnum UnitType{get{return UnitTypeWrapper;}}
公共价格(){}
}
公共类价格定义添加
{
公共虚拟长价格定义ID{get;set;}
公共虚拟长附加ID{get;set;}
公共价格定义添加(){}
}
我有一个PriceDefinition的id,我必须删除所有相关数据。我必须迭代所有这些复杂的结构吗?如何使用include然后加载对象以加载整个结构?有没有简单的方法删除所有这些结构


我有一个PriceDefinition对象,我必须插入它,包括它的所有相关数据。我怎样才能在调用SaveChanges时使所有id都获得适当的值呢?是否必须迭代所有元素才能插入所有元素?

要解决删除问题,请在数据库和实体设计器中使用级联删除。如果不使用级联删除,则必须将整个结构加载到应用程序中,并逐个删除实体

要解决插入问题,请使用所有新的相关实体准备新实体,只需在主实体上使用
AddObject
。它还将添加上下文未跟踪的所有相关实体。若您的ID是由数据库生成的,并且在实体设计器中正确设置了,那个么您就不必做更多的事情了

编辑:


另一种方法是,如果结构太复杂,只需使用存储过程来删除它,因为逐个加载结构和删除实体(每次删除一个DB往返)可能非常慢。

要解决删除问题,请在数据库和实体设计器中使用级联删除。如果不使用级联删除,则必须将整个结构加载到应用程序中,并逐个删除实体

要解决插入问题,请使用所有新的相关实体准备新实体,只需在主实体上使用
AddObject
。它还将添加上下文未跟踪的所有相关实体。若您的ID是由数据库生成的,并且在实体设计器中正确设置了,那个么您就不必做更多的事情了

编辑:


另一种方法是简单地使用存储过程来删除过于复杂的结构,因为逐个加载结构和删除实体(=每次删除一个DB往返)可能非常慢。

@Ladislav Mrnka:好的,所以我必须逐个删除实体(有些实体是软删除的)。我如何加载整个结构(子对象和孙子对象都有include…)是否有“LoadAll”之类的内容?@Naor:没有,没有LoadAll。您必须为整个结构手动指定包含。@Ladislav Mrnka:为什么要写“每次删除一个DB往返”?我不能在进程结束时使用SaveChanges吗?@Naor:可以,但EF没有命令批处理,所以它将每个命令作为到DB的单独往返执行-我确定它对Insert和Upadate执行此操作,但我没有检查是否删除。我相信会是一样的
SaveChanges
使这些命令成为单个事务的一部分。在我的情况下,我不想使用级联删除,因为我觉得这样不安全。(希望减少dba在没有意识到可能触发多次删除的情况下删除记录的人为错误的可能性)。另一方面,我不想用EF加载整个过程,所以我最终对带有上下文的数据库运行deletesql语句。ExecuteStoreCommand@LadislavMrnka:好的,所以我必须一个接一个地删除实体(有些实体是软删除的)。我如何加载整个结构(子对象和孙子对象都有include…)是否有“LoadAll”之类的内容?@Naor:没有,没有LoadAll。您必须为整个结构手动指定包含。@Ladislav Mrnka:为什么要写“每次删除一个DB往返”?我不能在进程结束时使用SaveChanges吗?@Naor:可以,但EF没有命令批处理,所以它将每个命令作为到DB的单独往返执行-我确定它对Insert和Upadate执行此操作,但我没有检查是否删除。我相信会是一样的
SaveChanges
使这些命令成为单个事务的一部分。在我的情况下,我不想使用级联删除,因为我觉得这样不安全。(希望减少dba在没有意识到可能触发多次删除的情况下删除记录的人为错误的可能性)。另一方面,我不想加载wh