Схема неверна и типы не могут быть загружены, поскольку сборка содержит EdmSchemaAttribute - PullRequest
3 голосов
/ 27 июля 2011

Получение следующей ошибки:

Указанная недопустимая схема.Ошибки:

Типы в сборке 'x, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' не могут быть загружены, поскольку сборка содержит атрибут EdmSchemaAttribute, и закрытие типов выполняетсязагружен по имени.Загрузка по имени и атрибуту не допускается.

Что именно означает эта ошибка?Я пытаюсь вставить в свое приложение модель EF из существующей базы данных.До того, как это приложение было основано на CodeFirst и использовало шаблон репозитория, но на всю жизнь я не могу заставить его работать.

Раньше у меня было:

public class BaseModelContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}

Но в модели EF- первый сценарий (тот, где таблицы уже существуют в БД), мне пришлось удалить их, так как не похоже, чтобы у них был шаблон репозитория в свойствах DbSet.Поэтому я удалил их, и тогда хранилище может использовать хранилище для классов, уже определенных в контекстном классе .designer.cs (модель EF).У него есть набор EdmSchemaAttribute внутри сгенерированного кода.

Итак, как мне заставить мой шаблон репозитория работать в сценарии сначала модель?Что конкретно означает вышеуказанная ошибка?

РЕДАКТИРОВАТЬ

Добавлен новый код:

 public class BaseModelContext : DbContext
    {
        // public DbSet<Location> Locations { get; set; }

        public BaseModelContext(string nameOrConnection)
            : base(nameOrConnection)
        {
        }

        public BaseModelContext()
        {
        }
    }

    public class VisitoriDataContext : BaseModelContext
    {
        public VisitoriDataContext()
            : base("visitoriDataConnection")
        {

        }

    }


    public interface IVisitoriDataContextProvider
    {
        VisitoriDataContext DataContext { get; }
    }

    public class VisitoriDataContextProvider : IVisitoriDataContextProvider
    {
        public VisitoriDataContext DataContext { get; private set; }

        public VisitoriDataContextProvider()
        {
            DataContext = new VisitoriDataContext();
        }
    }


    public class VisitoriRepository<T> : IRepository<T> where T : class
    {
        protected readonly IVisitoriDataContextProvider _ctx;

        public VisitoriRepository(IVisitoriDataContextProvider ctx)
        {
            _ctx = ctx;
        }

        public T Get(int id)
        {
            return _ctx.DataContext.Set<T>().Find(id);
        }

    }

    public interface ILocationRepo : IRepository<Location>
    {
        IEnumerable<Location> GetSuggestedLocationsByPrefix(string searchPrefix);
    }

    public class LocationRepo : VisitoriRepository<Location>, ILocationRepo
    {
        public LocationRepo(IVisitoriDataContextProvider ctx)
            : base(ctx)
        {

        }

        public IEnumerable<Location> GetSuggestedLocationsByPrefix(string searchPrefix)
        {

            return Where(l => l.name.Contains(searchPrefix)).ToList();

        }
    }

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Ошибка означает, что вы не можете объединить отображение первого кода (аннотации данных и свободный API) и отображение EDMX (с EntityObjects!) Для объекта с тем же именем.Эти два подхода являются дизъюнктивными.

Остальная часть вашего вопроса не ясна.

Кстати.построение сопоставления из существующей базы данных называется базой данных сначала, а не моделью вначале.

0 голосов
/ 15 июля 2014

Украсить сборку, содержащую тип GILayerModel, с атрибутом [assembly: EdmSchema].

0 голосов
/ 17 октября 2013

В моем случае у меня был класс, производный от сущности (код-первый класс) в другой сборке, и я добавлял экземпляр этого класса в DBContext:

в DBEntities проекте:

public class GISLayer
{
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int GISLayerId { get; set; }

    [StringLength(200)]
    public string LayerName { get; set; }

    public List<GISNode> Nodes { get; set; }
}

во второй сборке:

public class GISLayerModel : DBEntities.GISLayer
{
    public new List<GISNodeModel> NodesModel { get; set; }
}

и причина ошибки:

[WebMethod]
public void SaveGISLayers(GISLayerModel[] layers)
{
    using (DBEntities.DBEntities db = new DBEntities.DBEntities())
    {
        foreach (var l in layers)
        {
            if (l.GISLayerId > 0)
            {
                db.GISLayers.Attach(l); //attaching a derived class
                db.Entry(l).State = System.Data.EntityState.Modified;
            }
            else
                db.GISLayers.Add(l); //adding a derived class
            SaveGISNodes(l.NodesModel.ToArray(), db);
        }
        db.SaveChanges();
    }
}

Итак, я использовал Автомаппер скопировать свойства производного класса в новый экземпляр базового класса:

DBEntities.GISLayer gl = AutoMapper.Mapper.Map<DBEntities.GISLayer>(l);
if (gl.GISLayerId > 0)
{
    db.GISLayers.Attach(gl);
    db.Entry(gl).State = System.Data.EntityState.Modified;
}
else
    db.GISLayers.Add(gl);

Это решило проблему.

...