使用带有泛型类的 ContextBuilder 的 Entity Framework 4 创建 EDMX/DB-Schema 时出现异常
-
19-09-2019 - |
题
我正在使用 微软数据实体CTP (在实体框架 CTP 中)在 .NET 4 框架下从我的 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>>(); }
}
}
现在在保存时我得到了 例外:
找不到 EntityType“Prototype.SpecialClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”的映射和元数据信息。
在这条线上 模型容器:
return CreateObjectSet<SpecialClass<string>>();
我的通用“SpecialClass”的默认构造函数目前什么也不做,应该吗?
public class SpecialClass<T>
{
public SpecialClass()
{ }
}
或者这是一个问题 上下文生成器 不知道到底要做什么,有没有办法使用 builder.ComplexType() 或其他方法来指导它?
或者CTP还无法处理这种情况......
那 ”`1“在例外情况下,我的班级名称也不太适合我......
解决方案
现在,您不能将泛型类用作 EF 的实体(以及扩展的仅代码)。
这是 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 中没有计划支持将泛型类本身映射到模型中的实体。
希望这可以帮助
亚历克斯
不隶属于 StackOverflow