Вы можете создавать и использовать таблицы в БД динамически , хотя это не так просто.
Во-первых, вам нужно будет хранить метаданные о своих таблицах - каковы их имена, каковы их свойства, каковы типы этих свойств и т. Д.
Во-вторых, вам нужно создать объекты для доступа к этим таблицам, а также, EntityTypeConfiguration
классы, как здесь:
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
public class FooTypeConfiguration : EntityTypeConfiguration<Foo>
{
public FooTypeConfiguration()
{
ToTable("Foos");
HasKey(t => t.Id);
Property(t => t.Name).HasMaxLength(200)
.IsRequired();
}
}
Вы можете создавать DLL динамически, без промежуточного кода С # с помощью System.Reflection.Emit
. Или вы можете сгенерировать код C# и использовать System.CodeDom.Compiler
для его компиляции (этот способ проще).Вы также можете попробовать компилятор Roslyn (но у меня недостаточно опыта, чтобы советовать).
В-третьих, вам нужно будет загрузить скомпилированную DLL и создать DbContext
с помощью modelBuilder.Configurations.AddFromAssembly(...)
.
Вы можете найти нужный тип в сборке и использовать его для доступа к данным:
string typeName = ...;
var type = dynamicLoadedAssembly.GetType(typeName);
var set = dbContext.Set(type); // non-generic DB Set
Вы можете использовать System.Reflection
или dynamic
печатать, чтобы работать с этими объектами. Наконец, если вы будете генерировать C# код, вы можете создать свойства и реализации некоторого интерфейса для доступа к этим свойствам по именам:
public interface IAccessorByName : IReadOnlyDictionary<string, object>
{
object this[string name] { get; set; }
}
public Foo : IAccessorByName
{
private static readonly IDictionary<string, Func<Foo, object>> getters = new Dictionary<string, Func<Foo, object>>
{
{ "Id", (foo) => foo.Id },
{ "Name", (foo) => foo.Name },
};
private static readonly IDictionary<string, Action<Foo, object>> setters = new Dictionary<string, Action<Foo, object>>
{
{ "Id", (foo, value) => { foo.Id = (int)value; } },
{ "Name", (foo, value) => { foo.Name = (string)value; } },
};
public int Id { get; set; }
public string Name { get; set; }
public object this[string name]
{
get { return getters[name](this); }
set { setters[name](this, value); }
}
}
С таким же интерфейсом, вы можете создавать, читать, обновлять и удалять объекты динамически:
string typeName = "Foo";
var fooType = dynamicLoadedAssembly.GetType(typeName);
var foo = (IAccessorByName)Activator.CreateInstance(fooType);
foo["Id"] = 1;
foo["Name"] = "Jon Skeet";
var fooSet = dbContext.Set(fooType);
fooSet.Add(foo);
dbContext.SaveChanges();
Я предлагаю вам использовать ViewModel, а затем сопоставить свою сущность. см. это http://www.codeproject.com/Articles/1043977/Mapping-ViewModel-to-Model-in-ASP-NET-MVC-using-Im –
Вам следует отобразить модель EP для просмотра модели; добавить аннотацию данных к свойствам модели представления. – user1672994
Проблема в том, что мне нужно создать динамическую модель из базы данных. Свойства в модели могут быть добавлены динамически, и у них есть все типы данных (int, string, bool, List). Кроме того, мне нужно сохранить эти свойства в таблице, и это та часть, которую я не знаю, как это сделать. –
Tomislav