Можно ли использовать LinqToSql с PostgreSQL (желательно с Mono)? Можете ли вы порекомендовать какие-либо статьи, где он описывается шаг за шагом?
Linq To Sql с PostgreSQL
Ответ 1
Не из коробки. Вам нужно будет найти стороннего разработчика, который написал провайдера для PostgreSQL.
Одним из таких провайдеров является DbLinq. Инструкции по установке и использованию можно найти здесь.
Обратите внимание, что с 2016 года проект DbLinq перемещается в github, архивируется и больше не поддерживается.
Ответ 2
Я использую LINQ to SQL примерно через 2 года с базами данных MySQL и PostgreSQL (используя DbLinq для Windows, используя Mono в Linux и Mac OS X).
Поэтому LINQ to SQL не ограничивается SQL Server, но, как указано выше, вам нужно использовать внешние библиотеки.
В Mono DbLinq является основой пространства имен System.Data.Linq: вам не нужно разворачивать/регистрировать сборки DbLinq. То же самое для сборки Npgsql: она уже предоставляется самыми последними версиями Mono.
Вы должны знать, что поддержка неполна (у меня было много проблем, когда я попытался связать элемент управления ObjectDataSource с контекстом данных PostgreSQL: я решил их, выполнив ручную привязку данных к сгенерированным объектам). Но этого достаточно для большинства SQL-запросов (у меня почти никогда не было ошибок: сложные суставы можно моделировать несколькими более простыми запросами).
Существует небольшая разница между DbLinq и LINQ to SQL. Только строка подключения должна быть настроена путем предоставления информации о поставщике данных. Посмотрите на эти короткие образцы (я не нашел реального учебника об использовании DbLinq):
http://www.mono-project.com/Release_Notes_Mono_2.6
http://www.jprl.com/Blog/archive/development/mono/2009/Mar-12.html
Лично с помощью Mono 2.10.6 я использую этот тип строки подключения: "Server = localhost; Database = MyDB; User Id = postgres; Password = MyPassword; DbLinqProvider = PostgreSql; DbLinqConnectionType = Npgsql.NpgsqlConnection, Npgsql, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 5d8b90d52f46fda7"
Примечание. В Mono инструмент DbMetal заменяется командой "sqlmetal", которая имеет те же параметры (это просто оболочка вокруг DbMetal).
Ответ 3
Существует сторонний поставщик Linq для postgres (а также MySql и других баз данных) здесь.
Другой вариант - ngpsql
ОБНОВЛЕНИЕ Библиотека npgsql переехала на Github, вот обновленная ссылка updated link
Ответ 4
Используйте LinqToDB для PostgreSQL
https://www.nuget.org/packages/linq2db.PostgreSQL/
В Visual Studio откройте консоль NuGet и выполните следующее:
PM> Install-Package linq2db.PostgreSQL
В результате вы получите папку с вашим решением: LinqToDB.PostgreSQL
. В папке есть файл с именем CopyMe.PostgreSQL.tt.txt
. Прочтите в файле, что нужно сделать, чтобы создать класс Context.
Пример содержимого этого файла:
<#@ template language="C#" debug="True" hostSpecific="True" #>
<#@ output extension=".generated.cs" #>
<#@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.PostgreSQL.Tools.ttinclude" #>
<#@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
<#
/*
1. Copy this file to a folder where you would like to generate your data model,
rename it, and delete .txt extension. For example:
MyProject
DataModels
MyDatabase.tt
2. Modify the connection settings below to connect to your database.
3. Add connection string to the web/app.config file:
<connectionStrings>
<add name="MyDatabase" connectionString="Server=MyServer;Port=5432;Database=MyDatabase;User Id=postgres;Password=TestPassword;Pooling=true;MinPoolSize=10;MaxPoolSize=100;Protocol=3;" providerName="PostgreSQL" />
</connectionStrings>
4. To access your database use the following code:
using (var db = new MyDatabaseDB())
{
var q =
from c in db.Customers
select c;
foreach (var c in q)
Console.WriteLine(c.ContactName);
}
5. See more at https://github.com/linq2db/t4models/blob/master/Templates/ReadMe.LinqToDB.md.
*/
NamespaceName = "DataModels";
LoadPostgreSQLMetadata("MyServer", "5432", "MyDatabase", "postgres", "TestPassword");
// LoadPostgreSQLMetadata(string connectionString);
GenerateModel();
#>
Каждый раз, когда вы сохраняете файл *.tt
, класс будет *.tt
. Хорошо работает для нашей компании из 21 разработчика.
Ответ 5
Linq-to-SQL
поддерживает только SQL Server. Entity Framework поддерживает другие базы данных.
Ответ 6
Нет, LINQ to SQL работает только с MS SQL Server. Для доступа к источнику данных PostgreSQL необходимо использовать сторонний провайдер. Я рекомендую вам попробовать Devart LinqConnect. Кроме того, этот продукт предоставляет некоторые функции Entity Framework, например, сложный тип, поддержку типа наследования различий и т.д.