Классы объекта, отделенные от LINQ до поставщика SQL для реализации шаблона Репозитория. Как?

INSERT INTO SecondTable(Col1,Col2)
SELECT Col5,Col6
FROM FirstTable ft
LEFT JOIN SecondTable st ON st.Col1 = ft.Col1
WHERE st.Col1 IS NULL AND ft.RecType = 'ABC'
9
задан Jim G. 4 October 2009 в 02:21
поделиться

9 ответов

Я не знаю, точно ли это, что Вы хотите, но можно хотеть смотреть на код Витрины Rob Conery MVC. Он использует вариант шаблона репозитория с linq поставщиком. Он отображает LINQ на объекты Sql к объектам области и затем возвращает объекты области от поставщика репозитория к уровню служб, который переносит поставщика, разрешающего ему работать некоторая логика над данными, возвращенными, прежде чем это поразит бизнес-слой.

Вебкасты витрины MVC
Код

Мне это кажется, что Вы хотите, чтобы поставщики возвратили DTOs, и затем Вы хотите отобразить DTOs на объекты области в репозитории/уровне служб. Если это верно, Вы могли отобразить свой LINQ на поставщика SQL к DTOs, иметь его, возвращают их, затем отображают DTOs на объекты области в репозитории/уровне служб. Это должно работать просто великолепно, но это может стать утомительным, поскольку у Вас теперь было бы 2 отображающихся слоя.

В этом случае Вы имели бы: ProductService, который берет IProductRepository. Это вызывает методы на IProductRepository для возвращения DTOs. Это затем отображает DTOs на реальные бизнес-объекты и возвращает их коду вызова.

6
ответ дан 4 December 2019 в 08:17
поделиться

Можно создать внешний XML-файл, отображающий базу данных на любой класс:

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>

И затем передайте XML классу DataContext:

 using (var cn = GetDbConnection())
  { var mappingSrc = XmlMappingSource.FromReader(xmlReader);

    using (var db = new DataContext(cn, mappingSrc))
     { var q = from entity in db.GetTable<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }
5
ответ дан 4 December 2019 в 08:17
поделиться

Я нашел фантастическое сообщение в блоге (с большим количеством хорошего кода) об этом здесь: http: // iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx

4
ответ дан 4 December 2019 в 08:17
поделиться

Я думаю, что Вы хотите ПОСТЕПЕННО (Простые Объекты CLR) поддержку. LINQ к SQL имеет адаптер по имени Close2Poco.

Но я советовал бы переключаться на Платформу Объекта, в данный момент они также имеют ПОСТЕПЕННО адаптер, но в v2 его ожидаемый, который будет поддерживаться из поля.

3
ответ дан 4 December 2019 в 08:17
поделиться

Вы не должны использовать LINQ для сгенерированного кода SQL, можно украсить собственные классы необходимым ColumnAttributes или использовать внешний XML отображающийся файл.

2
ответ дан 4 December 2019 в 08:17
поделиться

Самый простой путь состоял бы в том, чтобы отделить Ваши объекты от datacontext: загрузите необходимый объект, отделите его от DataContext, используйте его однако, Вы любите, позже используете Присоединение () для связи его с DataContext для сохранения.

Печально LINQ не имеет никакого метода для отделения объектов от datacontext, но можно просто клонировать их, который работает приятно. Самый простой путь был бы чем-то вроде этого:

public static T CloneEntity<T>(T source)
{
  DataContractSerializer dcs = new DataContractSerializer(typeof(T));
  using (Stream stream = new MemoryStream())
  {
    dcs.WriteObject(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)dcs.ReadObject(stream);
  }
}
2
ответ дан 4 December 2019 в 08:17
поделиться

Я сделал что-то похожее с WCF

1 На Вашем DBML, набор Вы режим Serialization к Однонаправленному

2 столбца Set ALL на Ваших таблицах к UpdateCheck=false

3 Записи Ваш сервис что-то как следующее:

   public class Service1 : IService1
    {
        public Company GetCompany(int companyId)
        {
            using (DataClasses1DataContext dc = new DataClasses1DataContext())
            {
                return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
            }
        }

    public void SaveCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.Attach(company, true);
            dc.SubmitChanges();
        }
    }

    public void InsertCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.InsertOnSubmit(company);
            dc.SubmitChanges();
        }
    }
}

4 Добавляют сервисную ссылку

2
ответ дан 4 December 2019 в 08:17
поделиться

Не точно тот же сценарий, но я работаю для создания инструмента пользователя, который на основе XML-файла генерирует модель OO. Мой подход должен использовать LINQ для SQL позади сцены и так как я генерирую код автоматически, это было бы просто в использовании другой механизм для скажем, источника данных MySQL. Так как это не поддерживается LINQ к SQL, необходимо будет написать код доступа к данным вручную, но клиентский код, который будет использовать модель OO, изменится всегда.

1
ответ дан 4 December 2019 в 08:17
поделиться

Ваши классы Объекта могли реализовать IProduct, IUser, IOrder и т.д. взаимодействует через интерфейс, который был бы объявлен в Вашем блоке "Интерфейсов"? Таким образом, ссылки интерфейса IRepository только интерфейсы бизнес-объекта (т.е. наборы возвратов IProduct и т.д.) и блок "Интерфейсов" отделяются от Ваших других определенных для реализации блоков.

1
ответ дан 4 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: