Я работаю над проектом C#, в котором я динамически создаю сопоставление для решения ORM, а именно nHibernate, во время выполнения. из данной базы данных на данном сервере. Прямо сейчас я сосредоточен на том, чтобы заставить работать базовый объект и генерацию класса реляционного отображения во время выполнения. Я могу скомпилировать в памяти во время выполнения следующий класс через CodeDOM:
namespace DataDictionary.Domain
{
public class Entity
{
public virtual int EntityID { get; set; }
public virtual string EntityName { get; set; }
public virtual DateTime EntityFoundationDate { get; set; }
}
}
Однако, когда я пытаюсь скомпилировать эквивалент следующего класса с помощью CodeDOM:
using System;
using System.Linq;
using NHibernate.Cfg;
using NHibernate.Cfg.MappingSchema;
...
namespace DataDictionary.Domain
{
public class EntityMap : ClassMapping<Entity>
{
public EntityMap()
{
this.Table(Entity);
this.ID(p => p.EntityID);
this.Property(p => p.EntityName);
this.Property(p => p.EntityFoundationDate);
}
}
}
При компиляции получаю следующую ошибку: error CS0246: The type or namespace name 'Entity' could not be found (are you missing a using directive or an assembly reference?)
Мой вопрос: почему Entity
, несмотря на то, что он был помещен в правильное пространство имен во время компиляции во время выполнения, не виден EntityMap
.
Кроме того, для справки, вот метод, который я использую для создания EntityMap
:
public static object CreateNewObject(ref object table, AssemblyName domain, params FieldInfo[] columns)
{
if (columns == null || columns.Length == 0)
return null;
string tableName = table.GetType().Name;
//check to see if a class exists which both matches the name of `table`
//and whose full name contains the correct assembly to be used.
var namespaceCheck = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Name == tableName && Utilities.GetFriendlyAssemblyName(type.FullName).Equals("DataDictionary.Domain")
select type).FirstOrDefault();
if (namespaceCheck == null)
throw new InvalidOperationException("Valid type not found.");
StringBuilder builder = new StringBuilder("using NHibernate; using NHibernate.Cfg; using NHibernate.Cfg.MappingSchema; using NHibernate.Dialect; using NHibernate.Mapping.ByCode; using NHibernate.Mapping.ByCode.Conformist; ");
builder.Append("namespace DataDictionary.Domain{");
builder.AppendFormat("public class {0}Map : ClassMapping<{0}> {{", tableName);
builder.AppendFormat("public {0}Map(){{\n",tableName);
builder.AppendFormat("this.Table({0});", tableName);
//find the ID column.
var list = columns.Where(x => x.Name.ToUpper().Contains("ID"));
builder.AppendFormat("this.ID(p => p.{0})", Utilities.cleanFieldName(list.ElementAt(0).Name));
columns = columns.Where(x => !x.Equals(list.ElementAt(0))).ToArray();
//map the properties.
foreach (FieldInfo column in columns)
{
builder.AppendFormat("this.Property(p => p.{0});", Utilities.cleanFieldName(column.Name));
}
//close all open brackets.
builder.Append("}}}");
//send code to helper class for runtime compilation via CodeDOM.
return CodeDOM_Helpers.Execute(builder.ToString(), tableName,domain.Name);
}