Архитектура с SQL Server CE - PullRequest
       34

Архитектура с SQL Server CE

2 голосов
/ 17 января 2011

Мне нужно создать несколько небольших независимых приложений, которые можно скопировать на USB-устройство и запускать оттуда из коробки.Поэтому я подумал об использовании WPF, который сначала использует код EF для подключения к базе данных SQL Server CE.

Мой вопрос о том, какую архитектуру мне следует использовать.Хотя приложения автономны, я все же хотел бы отделить пользовательский интерфейс от домена и данных, чтобы иметь четкое разделение слоев.Но я также не хочу делать его слишком сложным.

Итак, я хочу иметь уровень пользовательского интерфейса (WPF / MVVM), который использует базовый уровень домена (доменные объекты с доменной логикой) и репозитории (которыесначала используйте код EF).

Мой вопрос: какой шаблон я должен использовать, чтобы заставить EF работать в этом случае?Есть ли где-нибудь пример, который демонстрирует, как реализовать CRUD-операции в таком сценарии?Например, должен ли я создать один контекст и оставить его открытым;или мне следует реализовать шаблон единицы работы и при необходимости прикрепить объекты к другому контексту?

Или вы бы сделали это совсем по-другому?

Спасибо за совет!

1 Ответ

2 голосов
/ 02 февраля 2011

Контекст EF должен быть открыт как можно быстрее.Предпочтительно использовать его в операторе using.

private static void ApplyItemUpdates(SalesOrderDetail originalItem,
    SalesOrderDetail updatedItem)
{
    using (AdventureWorksEntities context =
        new AdventureWorksEntities())
    {
        context.SalesOrderDetails.Attach(updatedItem);
        // Check if the ID is 0, if it is the item is new. 
        // In this case we need to chage the state to Added.
        if (updatedItem.SalesOrderDetailID == 0)
        {
            // Because the ID is generated by the database we do not need to
            // set updatedItem.SalesOrderDetailID.
            context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added);
        }
        else
        {
            // If the SalesOrderDetailID is not 0, then the item is not new
            // and needs to be updated. Because we already added the 
            // updated object to the context we need to apply the original values.
            // If we attached originalItem to the context 
            // we would need to apply the current values:
            // context.ApplyCurrentValues("SalesOrderDetails", updatedItem);
            // Applying current or original values, changes the state 
            // of the attached object to Modified.
            context.ApplyOriginalValues("SalesOrderDetails", originalItem);
        }
        context.SaveChanges();
    }
}

Существует метод Attach, который присоединяет сущности к контексту:

private static void AttachRelatedObjects(
    ObjectContext currentContext,
    SalesOrderHeader detachedOrder,
    List<SalesOrderDetail> detachedItems)
{
    // Attach the root detachedOrder object to the supplied context.
    currentContext.Attach(detachedOrder);

    // Attach each detachedItem to the context, and define each relationship
    // by attaching the attached SalesOrderDetail object to the EntityCollection on 
    // the SalesOrderDetail navigation property of the now attached detachedOrder.
    foreach (SalesOrderDetail item in detachedItems)
    {
        currentContext.Attach(item);
        detachedOrder.SalesOrderDetails.Attach(item);
    }
}

http://msdn.microsoft.com/en-us/library/bb896271.aspx

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