我正在使用 微软数据实体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 中没有计划支持将泛型类本身映射到模型中的实体。

希望这可以帮助

亚历克斯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top