我在 .NET 4 框架下使用 Microsoft.Data.Entity.CTP(在 Entity Framework CTP 中)从我的 C# 类创建 EDMX 元数据以创建数据库架构。
我设置了一个简单的模型:
public class AModelContainer : ObjectContext
{
public IObjectSet<RegularClass> RegularClasses {
get { return CreateObjectSet<RegularClass>(); }
}
}
我遵循基于我的模型定义新 ContextBuilder 的简单模式。
var builder = new ContextBuilder<AModelContainer>();
using(var context = builder.Create(new SqlConnection(connString)))
{
context.RegularClasses.AddObject(new RegularClass());
context.SaveChanges();
}
这很好用。 直到我尝试做一些更复杂的事情......
我用泛型类扩展我的模型
public class AModelContainer : ObjectContext
{
public IObjectSet<SpecialClass<string>> SpecialClasses {
get { return CreateObjectSet<SpecialClass<string>>(); }
}
}
现在在保存时我得到一个异常:
Mapping and metadata information could not be found for EntityType 'Prototype.SpecialClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
AModelContainer 中的这一行:
return CreateObjectSet<SpecialClass<string>>();
我的通用“SpecialClass”的默认构造函数目前什么都不做,对吗?
public class SpecialClass<T>
{
public SpecialClass()
{ }
}
或者这是 ContextBuilder 的问题,不知 Prop 体要做什么,有没有办法使用 builder.ComplexType() 或其他方法来指导它?
或者CTP还不能处理这种情况...
我的类(class)名称后面的“`1”在异常(exception)情况下也不适合我......
最佳答案
您现在不能将泛型类用作 EF 的实体(以及扩展名 Code-Only)。
这是 CLR 和概念模型之间映射功能的限制。
在 Beta2 之后,我们添加了允许这种事情的能力:
public class Entity<TKey>
{
public TKey ID {get;set;}
}
public class Person: Entity<int>
{
public string Firstname {get;set;}
public string Surname {get;set;}
}
哪里只有Person
是 EF 模型中的“实体”,ID
来自基类的属性显示为 Person
的属性.
但是 .NET 4.0/EF 4 中没有计划支持将泛型类本身映射到模型中的实体。
希望对你有帮助
亚历克斯
关于c# - 使用带有泛型类的 ContextBuilder 使用 Entity Framework 4 创建 EDMX/DB-Schema 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912333/