【问题标题】:ReferentialConstraint in the Entity Framework实体框架中的引用约束
【发布时间】:2009-07-15 21:11:36
【问题描述】:

我正在尝试在实体框架中设置我认为非常简单的数据模型。我有两个实体,OrderHeader 和 OrderLine。

订单页眉

+---------+--------+
| Name    | Type   |
+---------+--------+
| Id      |  Int   |
| Name    | String |
+---------+--------+

订单行

+---------+--------+
| Name    | Type   |
+---------+--------+
| Id      |  Int   |
| OrderId |  Int   |
| Name    | String |
+---------+--------+

每当我调用 OrderHeader.OrderLines.Remove(someOrderLine) 时,我希望从数据库中删除 OrderLine 而不是让它成为孤立的,但我似乎无法在实体框架中执行此操作。文档说明我应该使用引用约束,但该功能似乎不起作用(例如,http://msdn.microsoft.com/en-us/library/dd456813%28VS.100%29.aspx 指的是不存在的菜单)。有什么想法吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    当您调用 OrderHeader.OrderLines.Remove(someOrderLine) 时,如果您只想摆脱订单行,则删除关系(即外键),请执行以下操作:

       context.DeleteObject(someOrderLine);
       context.SaveChanges();
    

    【讨论】:

    • 只有在我删除 OrderHeader 时想删除 OrderLines 时才有效。当我从 OrderHeader 的 OrderLines 集合中删除 OrderLine 时,我想删除它
    【解决方案2】:

    有人帮我写了以下帮助函数来处理这种情况。首先我们在 ObjectContext 中定义这个辅助函数

    private void DeleteOrphans<TEntity, TRelatedEntity>(Func<TEntity, EntityCollection<TRelatedEntity>> collectionAccessor)
            where TEntity : EntityObject
            where TRelatedEntity : EntityObject
        {
            ObjectStateManager.ObjectStateManagerChanged += (_, e) =>
            {
                if (e.Action == System.ComponentModel.CollectionChangeAction.Add)
                {
                    var entity = e.Element as TEntity;
                    if (entity != null)
                    {
                        var collection = collectionAccessor(entity) as System.Data.Objects.DataClasses.EntityCollection<TRelatedEntity>;
                        if (collection != null)
                        {
                            collection.AssociationChanged += (__, e2) =>
                            {
                                if ((e2.Action == System.ComponentModel.CollectionChangeAction.Remove))
                                {
                                    var relatedEntity = e2.Element as TRelatedEntity;
                                    if (relatedEntity != null)
                                    {
                                        DeleteObject(relatedEntity);
                                    }
                                }
                            };
                        }
                    }
                }
            };
        }
    

    然后在上下文的构造函数中,我们调用类似于:

    DeleteOrphans<OrderHeader, OrderLine>(x => x.OrderLines);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多