Создание EF CodeFirst DbContext с помощью Roslyn

Просто небольшая идея, с которой я играю, не уверен, что она жизнеспособна или имеет много применения.

Я пытаюсь создать очень простую базу данных EF Code First с помощью Roslyn CTP.

Код:

var scriptEngine = new ScriptEngine(new[] { "System", "System.Core", typeof(DbContext).Assembly.Location });
var session = Roslyn.Scripting.Session.Create();

var t = scriptEngine.CompileSubmission<DbContext>(@"
  using System.Data.Entity;         
  public class Car  {
    public int Id {get; set;}
    public string Name {get;  set; }
  }

  public class Context : DbContext {
    public DbSet<Car> Cars {get; set; }
  }

  new Context();
", session);

t.Execute();

При выполнении возникает следующее исключение

Исключение:

Тип «Представление № 0 + Автомобиль» не был сопоставлен. Убедитесь, что тип не был явно исключен с помощью метода Ignore или аннотации данных NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным, вложенным или универсальным и не наследуется от EntityObject.

Просматривая список возможных проблем, я предполагаю, что Roslyn создает вложенный класс как часть генерации кода. В противном случае это имеет смысл "new Context ();" вызов должен быть обернут в какой-то класс / метод. Я мог бы создать сборку, которая подтвердит вышесказанное, но, вероятно, не будет иметь никаких подсказок о том, как ее правильно написать.

Я также пошел по пути Syntax.ClassDeclaration, но в итоге получил несколько сотен строк кода только для того, чтобы создать класс с 1 свойством и не было очевидного способа создать экземпляр этого класса.

Вопрос

Есть ли простой способ создать класс в Roslyn, который будет общедоступным (например, не вложенным в другой класс)?

5
задан Betty 5 February 2012 в 01:06
поделиться