2011-07-29 61 views
4

我正在工作,我想是一个代码优先的EF 4.1实现。数据库已经存在,基本模型已经存在(由XSD.exe为我的传入XML数据生成)。我编写了自己的映射,并更新了模型以使其与Entity Framework正常运行。模型生成过程中的验证错误

当我尝试运行我收到下面的错误代码:

One or more validation errors were detected during model generation:

System.Data.Edm.EdmEntityType: Name: Each type name in a schema must be unique. Type name 'CourtCase' is already defined.

我已经签了一倍检查,绝对只在一个位置定义这个类。我也习惯于在线以下让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. 
    } 
} 

上午我缺少实体框架配置的另一个关键组件?

完整的堆栈跟踪

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

何时发生验证错误 - 在编译时或运行时?如果在运行时,在你的代码中的哪一点?您在设计时是否有EDMX文件,或者是否在飞行中编译? –

回答

2

本质上,我找到了一组创建循环引用的类(原始类是从设计很差的XML Schema生成的)。一旦我删除了循环引用,这个错误就解决了。

1

无论是在飞行中或在设计时产生的,你可能有你的解决方案中的EDMX文件,对不对?我将在这里检查。请记住,此架构中有三层 - 存储层,概念层和映射层。我会检查这些图层中的每一个(不确定这是否适用于映射图层)重复的实体 - 特别是CourtCase实体。

如果您的EDMX是即时生成的,那么我会向文件系统写出一份副本,以便您可以更轻松地检查它。

我很想知道执行是否使它超过了反序列化XML数据的地步。这将有助于排除XML数据作为问题的根源。

编辑:我认为您的原始文章指定“数据库第一”。我不太熟悉“代码优先”,但在调查时确实发现了这个great walkthrough

编辑2:经过多一点调查 我的猜测是'其他'类型是一个约定的结果。尝试删除一些these conventions

+0

在将新的CourtCase添加到Cases DbSet的调用期间,反序列化期间的运行时期间发生该错误。我对EF非常陌生,所以我需要阅读EDMX文件的内容以及为什么需要它。在我的项目中没有一个可以在运行时生成。 –

+0

当我实例化我的DbContext时,实际发生错误。 –