Как заполнить БД MS Access с помощью LINQ? (link2db)

374
17 февраля 2017, 01:03

В поисках инструмента для работы с БД при помощи LINQ наткнулся на linq2db, но толи я тупой, толи документация слишком скудная, но я застрял на элементарном Insert. Ссылка на github библиотеки: https://github.com/linq2db/linq2db

Вот моя Таблица в БД:

[Table(Name = "AnimePosters")]
public class AnimePoster
{
    [PrimaryKey, Column(Name = "title_id"), NotNull]
    public int title_id { get; set; }
    [Column(Name = "original"), NotNull]
    public string original { get; set; }
    [Column(Name = "preview"), NotNull]
    public string preview { get; set; }
    [Column(Name = "x96"), NotNull]
    public string x96 { get; set; }
    [Column(Name = "x48"), NotNull]
    public string x48 { get; set; }
}
public class DBRatesDB : LinqToDB.Data.DataConnection
{
    public DBRatesDB() : base("RatesDB") { }
    public ITable<AnimePoster> AnimePoster { get { return GetTable<AnimePoster>(); } }
}

Описал сущности для таблицы. На считывание (Select) компилятор не ругается, а вот, когда я пытаюсь воспользоваться Insert как написано в ReadMe.

Пример из README.md

using (var db = new DbNorthwind())
{
  db.Insert(product);
}

Как я понял, product это экземпляр класса сущности, которая определяет таблицу из БД, то есть для меня это должен быть AnimePoster, но выдаёт непонятную мне ошибку.

Может кто может помочь с этим или у вас есть свои варианты библиотек для работы с LINQ с БД Access или SQLite (любой из них). Буду очень благодарен, если к своим вариантам приложите примеры для основных запросов вроде Select|Insert|Delete|Update или ссылку на документацию, где это всё подробно расписано.

Answer 1

Документация библиотеки достаточно не плохая. Библиотека для обеспечения безопасности типов и выявления ошибок на этапе компиляции использует деревья выражений Expression.

В первую очередь это позволяет Вам избавиться от "магических строк" для имен объектов базы данных и предоставляет простой C# синтаксис для генерации запросов к БД.

Конкретно в Вашем примере у Вас ошибка в использовании (и да, в документации это есть). И Да Insert в данном случае это команда которой нужно указать что вставлять не много по другому:

using (var db = new DbNorthwind())
{
  AnimePoster ap = new AnimePoster(); // get animePoster
  db.AnimePoster
    .Value(p => p.original, () => ap.original)
    .Value(p => p.preview, () => ap.preview)
    .Value(p => p.x48, () => ap.x48)
    .Value(p => p.x96, () => ap.x96)
    .Value(p => p.title_id, () => ap.title_id)
    .Insert();
}

Как верно заметил @Bulson более простым способом (если вам не нужно выбирать какие поля вставлять, а какие нет) будет просто:

using (var db = new DbNorthwind())
{
  AnimePoster ap = new AnimePoster(); // get animePoster
  db.Insert(ap); // Вместо db.AnimePoster.Insert(ap);
}

Или с Identity:

using (var db = new DbNorthwind())
{
  AnimePoster ap = new AnimePoster(); // get animePoster
  db.InsertWithIdentity(ap);
}

Собственно под заголовком Insert там есть и более сложные и гибкие примеры и более простые. В том коде что у вас вы также можете вставить сразу несколько элементов в БД:

using (var db = new DbNorthwind())
{
  var animePosters = db.AnimePoster.Select( /*Ваш Select*/x => x);
  db.BulkCopy(animePosters);
}
READ ALSO
Когда в ASP.NET MVC стоит прибегать к WCF?

Когда в ASP.NET MVC стоит прибегать к WCF?

Видел, что некоторые Web-приложения работают с WCF-службами

344
Как узнать размер объекта?

Как узнать размер объекта?

Какие есть способы получить размер объекта в памяти? Можно не обязательно в рантайме (кодом)

359
Как устранить конфликт? [требует правки]

Как устранить конфликт? [требует правки]

Как устранить конфликт?

309