Не может подразумеваться от класса A до Generi c Type - PullRequest
0 голосов
/ 23 апреля 2020

В одной базе данных мы разрабатываем несколько проектов. Допустим, проект A является пространством имен ProjectA , а другой проект ProjectB . Когда оба сначала используют БД, контекст будет отличаться, но DbSet являются общими. Когда ProjectA создает контекст, тогда Table имеет значение ProjectA.Models.TableA и ProjectB создает контекст, тогда Table является ProjectB.Models.TableA

Теперь я хочу создать обобщенный метод c, чтобы идентифицировать TableA и вставить TableA записей.

Я использовал для идентификации

 string TableName = "TableName";
 Type type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(t => t.Name == TableName);

Для Generi c вставка записей, которые я использую ниже.

 public static void Create<TEntity>(this DbContext db, TEntity entityToCreate) where TEntity : class
    {
        db.Set<TEntity>().Add(entityToCreate as TEntity);
    }

Когда я пытаюсь вставить Create (db, item) , где item является объектом столбца таблиц и значений.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Здесь пункт имеет такие же класс A свойства

        Type type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(t => t.Name == TableName);
        Object inst = Activator.CreateInstance(type);
        foreach (var property in item.GetType().GetProperties())
        {
            inst.GetType().GetProperty(property.Name).SetValue(inst, property.GetValue(item, null), null);
        }
        Create(db, inst);
0 голосов
/ 23 апреля 2020

Два типа - это совершенно разные типы, потому что они находятся в разных пространствах имен, даже если у них одинаковые имена, свойства и т. Д. c. Вы не можете напрямую привести между ними.

Я бы предложил поместить ваши модели в отдельную библиотеку (проект) и сослаться на эту библиотеку из ProjectA и ProjectB. Вы также можете поместить свой код репозитория. в этой библиотеке, если между двумя проектами будет то же самое.

...