0

好的,这里有一些上下文:我正在使用 EF5、MVC4 和 SQL CE4 来构建一个 Web 应用程序。我一直在松散地遵循本教程,但有一些不同之处。

  1. 我的上下文类和 POCO 对象在它们自己的程序集中。
  2. 我正在使用 SQL CE4 而不是 SQL Express Local DB
  3. 我的课不像教程那么简单

我已经使用了一种解决方法来让简单的类可以注册。

我曾认为 EF5支持在 EF5 中使用枚举,但它们可以在 Keys 中使用吗?

当我尝试为一个简单的类(1 个 int 键属性,1 个字符串属性)添加一个控件(添加控制器,具有读/写操作和视图的 MVC 控制器,使用实体框架)时,它可以工作。尝试添加具有作为键(主键或外键)一部分的属性的类时,出现各种错误

Unable to retrieve metadata for 'blah'.  Using the 
same DbCompiledModel to create contexts against different types of 
database servers is not supported. Instead, create a separate 
DbCompiledModel for each type of server being used.

Index was out of range. Must be non-negative and less than the size of
the collection.
Parameter name: index

C:\Program Files (x86)\Microsoft Visual Studio\11.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4\
CodeTemplates\AddController\ControllerWithContext.tt(0,0) : error :
Running transformation: System.IndexOutOfRangeException: Index was outside the bounds of the
array.
---StackTrace---

我在这些类之间发现的唯一相似之处是它们有一个绑定到键的 emun。其他具有非键枚举的类正确生成。这是问题还是我完全错过了标记?

编辑:失败的类的示例

public class A
{
    public virtual AIdEnum Id { get; set; }
    public virtual string Name { get; set; }

    public virtual ICollection<B> Bs { get; set; }
    public virtual ICollection<C> Cs { get; set; }
}
4

3 回答 3

0

看来我的问题是控制器创建不适用于 SQLCE 4.0 连接字符串,因此使用 System.Data.SqlClient 提供者的连接字符串处理了该问题。

我遇到的下一个问题是 connectionString 值(例如加密)没有通过这种方式得到尊重,所以我现在有 2 个不同的构造函数来解决这个错误。

#if DEBUG
    public Context()
        : base("name=DefaultConnection")
    { ; }
#else
    /// <summary>
    /// Default Constructor
    /// </summary>
    public Context()
        : base("name=CompactConnection")
    { ; }
#endif

这是我的配置:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="System.Data.SqlServerCe.4.0" />
        </parameters>
    </defaultConnectionFactory>
</entityFramework>
<connectionStrings>
    <add name="CompactConnection" providerName="System.Data.SqlServerCe.4.0"
        connectionString="Data Source=&quot;|DataDirectory|\DB.sdf&quot;;encryption mode=platform default;password=&quot;P4$$w0rd!&quot;"/>
    <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MsSqlCe-20121028004432;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-MsSqlCe-20121028004432.mdf" />
</connectionStrings>

当然,这只是解决更深层次问题的一种解决方法。如果其他人知道这个问题的根本原因,我很想知道。

于 2013-02-08T19:31:27.317 回答
0

好的,所以我刚刚使用 SQL CE 4 快速运行了它,它似乎工作得很好:

public class EnumTestContext : DbContext
{
    public EnumTestContext() : base("CEDB")
    {

    }

    public DbSet<MyClass> MyClasses { get; set; }

}

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}

public class MyClass
{
    [Key, Column(Order = 0)]
    public MyEnum MyEnumKey { get; set; }

    [Key, Column(Order = 1)]
    public int MyIntKey { get; set; }

    [Column(Order = 2)]
    public string Name { get; set; }

}

然后我添加一个这样的实体:

using (var context = new EnumTestContext())
{
    context.MyClasses.Add(new MyClass()
        {
        MyEnumKey = MyEnum.EnumValue1,
        MyIntKey = 22,
        Name = "Hello World"
        });
    context.SaveChanges();
}

这对我来说一切正常 - 这有帮助吗?

于 2013-02-08T15:55:59.407 回答
0

你需要把这一行:

Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

在 DbContext 生命周期开始之前。

可以在 MSDN Gallery中下载的示例

于 2013-02-08T18:01:35.537 回答