ReferentialConstraint в Entity Framework - PullRequest
0 голосов
/ 16 июля 2009

Я пытаюсь настроить довольно простую модель данных в Entity Framework. У меня есть две сущности, OrderHeader и OrderLine.

OrderHeader

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

OrderLine

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

Каждый раз, когда я вызываю OrderHeader.OrderLines.Remove (someOrderLine), я хочу, чтобы OrderLine был удален из базы данных вместо того, чтобы оставить его сиротой, но я не могу сделать это в Entity Framework. В документации говорится, что я должен использовать ссылочную зависимость, но эта функция не работает (например, http://msdn.microsoft.com/en-us/library/dd456813%28VS.100%29.aspx относится к несуществующим меню). Есть идеи?

Ответы [ 2 ]

0 голосов
/ 16 июля 2009

Кто-то помог мне написать следующую вспомогательную функцию, чтобы справиться с этой ситуацией. Сначала мы определяем эту вспомогательную функцию внутри 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);
0 голосов
/ 16 июля 2009

Когда вы вызываете OrderHeader.OrderLines.Remove (someOrderLine), вы удаляете связь (т. Е. Внешний ключ), если хотите просто избавиться от строки заказа, что-то вроде:

   context.DeleteObject(someOrderLine);
   context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...