收到以下错误:
指定的架构无效。错误:
程序集中的类型'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();
}
}
答案 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类型的程序集。