我正在工作,我猜是代码优先的EF 4.1实现。数据库已经存在,并且已经存在基本模型(由XSD.exe为我的传入XML数据生成)。我编写了自己的映射并更新了模型,以便与Entity Framework正常运行。
当我尝试运行代码时,我收到以下错误:
在模型生成期间检测到一个或多个验证错误:
System.Data.Edm.EdmEntityType:Name:架构中的每个类型名称都必须 独一无二。类型名称'CourtCase'已经定义。
我检查并加倍检查,绝对只在一个位置定义了这个类。我也习惯于下面的行来阻止DbContext尝试创建自己的模型。
Database.SetInitializer<LoadContext>(null);
我的XML数据被反序列化到我的模型中,然后我只是想将它保存到数据库中:
var serializer = new XmlSerializer(typeof (CourtCase));
var xmlReader = new XmlTextReader(
new MemoryStream(Encoding.Default.GetBytes(_itemText)));
_deserializedCase = (CourtCase) serializer.Deserialize(xmlReader);
Database.SetInitializer<LoadContext>(null);
using (var dbContext = new LoadContext())
{
dbContext.Cases.Add(_deserializedCase);
dbContext.SaveChanges();
}
的DbContext:
public class LoadContext : DbContext
{
public DbSet<CourtCase> Cases { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Configurations.Add(new CaseMap());
etc.
}
}
我是否遗漏了Entity Framework配置的另一个关键组件?
完整堆栈跟踪
at System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model, XmlWriter writer)
at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)
答案 0 :(得分:2)
基本上我发现了一组创建循环引用A.B.C.A
的类(原始类是从设计非常糟糕的XML Schema生成的)。删除循环引用后,此错误已解决。
答案 1 :(得分:1)
无论是动态生成还是设计时可用,您的解决方案中都可能有EDMX文件,对吧?我会在这里检查。请记住,此架构中有三个层 - 存储层,概念层和映射层。我会检查这些层中的每一层(不确定这适用于映射层)是否存在重复实体 - 特别是CourtCase的权利。
如果您的EDMX是动态生成的,那么我会将一份副本写入文件系统,以便您可以更轻松地检查它。
我很想知道执行是否超出了您反序列化XML数据的程度。这将有助于排除XML数据作为问题的根源。
编辑:我认为您的原始帖子指定了“数据库优先”。我对“代码优先”并不熟悉,但在调查时确实发现了great walkthrough。
Edit2 :经过多一点调查 我的猜测是'其他'类型是约定的结果。尝试删除部分these conventions。