由于程序集包含EdmSchemaAttribute,因此无法加载模式无效和类型

时间:2011-07-27 16:06:07

标签: entity-framework repository-pattern

收到以下错误:

指定的架构无效。错误:

  

程序集中的类型'x,Version = 1.0.0.0,Culture = neutral,   无法加载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 个答案:

答案 0 :(得分:3)

错误意味着您无法为具有相同名称的实体组合代码优先映射(数据注释和流畅API)和EDMX映射(使用EntityObjects!)。这两种方法是分离的。

你的其余问题不明确。

顺便说一下。从现有数据库构建映射称为数据库,首先不是模型。

答案 1 :(得分:0)

在我的例子中,我有一个派生自另一个程序集中的实体(代码优先类)的类,我在DBContext中添加了这个类的实例:

<{1>}项目中的

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; }
}

因此,我使用AutoMapper将派生类的属性复制到新的基类实例:

[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();
    }
}

解决了这个问题。

答案 2 :(得分:0)

装饰包含具有[assembly: EdmSchema]属性的GILayerModel类型的程序集。