SqlMetal не может создать DBML из базы данных Sqlite - PullRequest
1 голос
/ 16 декабря 2009

Я пытаюсь использовать новый инструмент Mono 2.6 SqlMetal для создания файла DBML для простой базы данных Sqlite. Схема действительно проста следующим образом:

CREATE TABLE Tags (
    Id              INTEGER PRIMARY KEY,
    TagName         TEXT,
    Description     TEXT);
CREATE TABLE Trends (
    TagId           INTEGER NOT NULL,
    Timestamp       DATETIME NOT NULL,
    Value           TEXT,
    PRIMARY KEY (tagid, timestamp));

Я пытаюсь создать файл DBML, используя следующее:

sqlmetal.exe /conn:"Data Source=MyDatabase.db" /namespace:MyNamespace /provider:Sqlite /dbml:MyDatabase.dbml

Я получаю следующий вывод:

>>> Reading schema from SQLite database
<<< Writing file 'MyDatabase.dbml'
sqlmetal failed:System.InvalidOperationException: There was an error reflecting type 'DbLinq.Schema.Dbml.Database'. --->
 System.InvalidOperationException: DbLinq.Schema.Dbml.Database is inaccessible due to its protection level. Only public types can be processed
  at System.Xml.Serialization.ReflectionHelper.CheckSerializableType (System.Type type, Boolean allowPrivateConstructors ) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlReflectionImporter.ImportClassMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Type type, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000] in <filename unknown>:0
  at System.Xml.Serialization.XmlSerializer..ctor (System.Type type, System.Xml.Serialization.XmlAttributeOverrides overrides, System.Type[] extraTypes, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000] in <filename unknown>:0  at System.Xml.Serialization.XmlSerializer..ctor (System.Type type) [0x00000] in <filename unknown>:0
  at DbLinq.Schema.Dbml.DbmlSerializer.Write (System.IO.Stream xmlStream, DbLinq.Schema.Dbml.Database dbml) [0x00000] in <filename unknown>:0
  at DbMetal.Generator.Implementation.Processor.WriteSchema (DbLinq.Schema.Dbml.Database dbSchema, ISchemaLoader schemaLoader, DbMetal.Parameters parameters) [0x00000] in <filename unknown>:0
  at DbMetal.Generator.Implementation.Processor.ProcessSchema (DbMetal.Parameters parameters) [0x00000] in <filename unknown>:0

Я могу использовать опцию / code для создания файла кода C #, но он всегда дает сбой при генерации DBML.

Мне не хватает тонкой опции командной строки или эта новая сборка SqlMetal не работает для Sqlite?

1 Ответ

2 голосов
/ 16 декабря 2009

Вы поверите, что я раньше не пытался сгенерировать файл DBML? </ Sheepish-grin>

Короткая версия: это ошибка, на которую вы попали, без обходного пути. Я подал это как http://code.google.com/p/dblinq2007/issues/detail?id=171.

Более длинная версия: кажется, не существует простого решения для этого (кроме "jettison System.Xml.Serialization"), так как ссылочный тип DbLinq.Schema.Dbml.Database не может быть публичным из System.Data.Linq.dll, для ~ очевидные причины. «Обходной путь» построения DbLinq под Linux и использования DbMetal.exe не работает из-за другой ошибки.

Приносим извинения за неудобства.

...