2011-07-27 32 views
3

获取以下错误:由于程序集包含EdmSchemaAttribute,程式无效并且类型无法加载

指定的模式无效。错误:

The types in the assembly 'x, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' cannot be loaded because the assembly contains the EdmSchemaAttribute, and the closure of types is being loaded by name. Loading by both name and attribute is not allowed.

这个错误究竟意味着什么? 我试图从现有数据库中将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

的错误意味着你不能用相同的实体相结合的代码首先映射(数据注释和流畅API)和EDMX映射(与EntityObjects!)名称。这两种方法是分离的。

你的问题的其余部分不清楚。

Btw。从现有数据库构建映射称为数据库首先不是模型。

+0

好吧,那么如何首先创建一个带有数据库的存储库模式? – jaffa

+0

版本库模式对您如何使用EF的方式没有依赖性。发布存在问题的存储库示例。 –

+0

嗨,你可以看看我的代码编辑,我已经添加了包装/上下文提供者类。应用程序抛出'GetSuggestedLocationsByPrefix'方法。 – jaffa

0

就我而言,我不得不从另一个程序集中的实体(代码优先类)派生的类,而我加入这个类中的DbContext的一个实例:在DBEntities项目

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

和错误的原因:

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; } 
} 
在第二组件

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

所以,我用AutoMapper派生类的属性复制到基类的新实例:

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

这解决了这个问题。

0

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

相关问题