Статьи

Драйвер NuoDB .NET предлагает поддержку Entity Framework

Нам нравится держать вещи свежими здесь в нашем техническом блоге NuoDB, поэтому мы пробуем что-то новое с этим постом. Мы пригласили разработчика из нашего сообщества пользователей внести свой вклад в гостевой пост, и его зовут Иржи Синкура. Я взволнован, потому что он собирается рассказать о значительных улучшениях, которые он внес в наш новый драйвер .NET. Так что, чтобы не украсть его гром, я оставлю это вам на чтение — наслаждайтесь! ~ Пол

Недавно я начал работать над драйвером NuoDB .NET, чтобы улучшить его, и особенно над внедрением поддержки Entity Framework. Я играл с NuoDB раньше, даже из .NET, но использовал только ODBC, который был доступен в то время. В настоящее время доступен хороший базовый драйвер .NET, и теперь он даже имеет полную поддержку Entity Framework.

Когда я работал над этим, основное внимание уделялось доставке наиболее ценных деталей разработчикам. Это означает, что драйвер в настоящее время предназначен для .NET Framework 4.0 (или новее) и Entity Framework 4 и 5. На мой взгляд, это большая часть сегодняшнего использования.

Вы можете ожидать полной поддержки использования Entity Framework с Entity Data Model в виде файла EDMX или с помощью Code First. Не нужно принимать решения. Конечно, драйвер также обеспечит полную поддержку LINQ в той степени, в которой это поддерживает сама NuoDB.

Если вы хотите пойти дальше, я рекомендую перейти на  страницу загрузки  и получить последнюю  версию драйвера ADO.NET для NuoDB и ссылаться на нее из вашего проекта. Наслаждаться поездкой.

Сначала я создам простое приложение, которое обращается к данным в стандартной базе данных NuoDB по хоккею. Сначала я буду использовать Code, потому что тогда вы сможете увидеть весь код и вам не придется возиться с созданием файла EDMX и т. Д.
Некоторые основные структуры:

class HockeyContext : DbContext
{
	public HockeyContext()
		: base(new NuoDbConnection(Data.ConnectionString), true)
	{ }

	public DbSet Hockey { get; set; }

	protected override void OnModelCreating(DbModelBuilder modelBuilder)
	{
		base.OnModelCreating(modelBuilder);

		var hockeyConf = modelBuilder.Entity();
		hockeyConf.HasKey(x => x.Id);
		hockeyConf.Property(x => x.Id).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
		hockeyConf.Property(x => x.Number).HasColumnName("NUMBER");
		hockeyConf.Property(x => x.Name).IsRequired().HasColumnName("NAME");
		hockeyConf.Property(x => x.Position).IsRequired().HasColumnName("POSITION");
		hockeyConf.Property(x => x.Team).IsRequired().HasColumnName("TEAM");
		hockeyConf.ToTable("HOCKEY", "USER");
	}
}

class Hockey
{
	public int Id { get; set; }
	public int Number { get; set; }
	public string Name { get; set; }
	public string Position { get; set; }
	public string Team { get; set; }
}

Я переопределяю  OnModelCreating здесь, чтобы указать отображение в базу данных (и даже явно установить информацию о ключе, хотя соглашение по умолчанию будет соответствовать ему). Если вы когда-либо использовали Entity Framework и Code First, это должно быть вам знакомо.

Теперь немного кода, чтобы действительно что-то сделать:

using (var ctx = new HockeyContext())
{
	var longestNames = ctx.Hockey.OrderByDescending(x => x.Name.Length).Select(x => x.Name).Take(3);
	Console.WriteLine("Top 3 longest name has:");
	foreach (var item in longestNames)
		Console.WriteLine(item);
	Console.WriteLine("===");

	foreach (var item in ctx.Hockey)
	{
		Console.WriteLine("{0,2}: {1,-20}\t{2}", item.Number, item.Name, item.Team);
	}
	Console.WriteLine("===");

	foreach (var item in "NuoDB")
	{
		var letter = item.ToString().ToUpper();
		var query = ctx.Hockey.Where(x => x.Name.ToUpper().Contains(letter)).Select(x => x.Name);
		Console.WriteLine(query);
		Console.WriteLine("Players starting with '{0}':", letter);
		foreach (var name in query)
			Console.WriteLine(name);
		Console.WriteLine();
	}
	Console.WriteLine("===");
}

Этот код выдает несколько запросов к базе данных, используя некоторые упорядочения, проекции и фильтры. Последняя партия кода также печатает выполняемый запрос на консоли, поэтому вы можете увидеть его и сравнить с тем, что вы можете написать. Запрос выглядит так:

SELECT
"Extent1"."NAME" AS "NAME"
FROM "USER"."HOCKEY" AS "Extent1"
WHERE UPPER("Extent1"."NAME") LIKE ?.p__linq__0 ESCAPE '\'

Что более или менее то, что я бы написал сам.

Мы также можем повеселиться с обновлениями, удаляет и вставляет. Как насчет поменять все названия команд?

foreach (var item in ctx.Hockey)
{
	item.Team = new string(item.Team.Reverse().ToArray());
}
var newHockey = new Hockey() { Name = "Test", Number = 10, Position = "Test", Team = "Test" };
ctx.Hockey.Add(newHockey);
ctx.SaveChanges();
Console.WriteLine(newHockey.Id);

Это работает снова, как и ожидалось. Здесь нет неприятного сюрприза. Итак, давайте перейдем к последнему шагу и попробуем немного покопаться в инфраструктуре. Часто у вас есть модель, и вы хотите создать из нее сценарий базы данных (который вы затем можете отправить, т. Е. Ваш администратор базы данных проверит и выполнит ее). Примечание: здесь я не использую миграцию Entity Framework, что является еще одним способом создания сценария базы данных и, что более важно, также обновляет базы данных, автоматически создавая сценарии изменения.

Чтобы увидеть, как обрабатываются некоторые общие типы данных, я создал эту структуру:

class SampleNewDatabaseContext : DbContext
{
	public SampleNewDatabaseContext()
		: base(new NuoDbConnection(Data.ConnectionString), true)
	{ }

	public DbSet SomeEntities { get; set; }

	protected override void OnModelCreating(DbModelBuilder modelBuilder)
	{
		base.OnModelCreating(modelBuilder);
		modelBuilder.Entity().ToTable("TEST_TABLE", "USER");
	}
}

class SomeEntity
{
	public long Id { get; set; }
	public Guid Guid { get; set; }
	public string S { get; set; }
	public double D { get; set; }
}

Возможно, вы знаете, что NuoDB в настоящее время не имеет встроенной поддержки типа данных GUID, но я проделал дополнительную работу, чтобы вы могли сохранить и прочитать этот базовый тип данных без каких-либо хлопот. Если вы запустите этот код:

using (var ctx = new SampleNewDatabaseContext())
{
	Console.WriteLine(((IObjectContextAdapter)ctx).ObjectContext.CreateDatabaseScript());
}

Вы вернете сценарий:

CREATE TABLE "USER"."TEST_TABLE" (
        "Id" BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
        "Guid" CHAR(38) NOT NULL,
        "S" CLOB,
        "D" DOUBLE PRECISION NOT NULL
);
ALTER TABLE "USER"."TEST_TABLE" ADD PRIMARY KEY ("Id");

Конечно, если вы предоставите некоторые дополнительные детали отображения в  OnModelCreating сценарии, они будут другими, поэтому вы можете, например, добавить некоторое ограничение длины в Sсвойство « », чтобы оно в конечном итоге стало « varchar(x)», например.

Надеюсь, вам понравился этот краткий обзор поддержки Entity Framework в NuoDB, и вы можете взять мои фрагменты кода и поиграть с ними.