只是我正在玩的一个小想法,不确定它是否可行或有多大用处。
我正在尝试使用 Roslyn CTP 生成一个非常基本的 EF Code First 数据库。
代码:
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();
执行时出现以下异常
例外:
未映射类型“Submission#0+Car”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的、嵌套的或泛型的,并且不是从 EntityObject 继承的。
查看可能的问题列表,我猜 Roslyn 正在将嵌套类作为代码生成的一部分。这是有道理的,否则“new Context();” call 需要被包装到某种类/方法中。我可以发出一个程序集,它可以确认上述内容,但可能没有任何关于如何正确编写它的线索。
我也走上了 Syntax.ClassDeclaration 的路线,但最后只用了几百行代码来创建一个具有 1 个属性的类,并且没有明显的方法来实例化该类。
问题
有没有一种简单的方法可以在 Roslyn 中创建一个可公开访问的类(例如,不嵌套在另一个类中)?