我正在开发一个简单的软件,它首先使用Entity Framework代码,然后使用sql server compact 4.此时此设置正常运行.实体框架创建sql server压缩文件(如果它尚不存在).数据库的路径是从存储在app.config文件中的连接字符串中定义的.它是这样构建的:
<connectionStrings>
<add name="DataContext"
connectionString="Data source=Database.sdf;"
providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
但是,我想将数据库放在当前用户的Application Data文件夹(我的win7机器上的C:\ Users\User\AppData\Roaming文件夹)中的文件夹中.我已经尝试将connectionstring的数据源设置为%APPDATA%\ Database.sdf,但是这不起作用,我得到了"路径中的非法字符"异常.
我想坚持使用connectionstring方法,因为我想为我的单元测试使用不同的数据库而不是我的实际应用程序.这样,通过将app.config文件放在项目的根目录中,可以轻松地修改数据库.
有人能引导我朝着正确的方向前进吗?
我有一个带有Entity Framework 5.0 e Sql Server CE 4.0的.NET4.0应用程序.
我有两个实体,一对多(父/子)关系.我已将其配置为在父删除时级联删除,但由于某种原因它似乎不起作用.
这是我的实体的简化版本:
public class Account
{
public int AccountKey { get; set; }
public string Name { get; set; }
public ICollection<User> Users { get; set; }
}
internal class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
this.HasKey(e => e.AccountKey);
this.Property(e => e.AccountKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(e => e.Name).IsRequired();
}
}
public class User
{
public int UserKey { get; set; }
public string Name { get; set; }
public Account Account { get; set; …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio 2008来设计SQL Server Compact Edition数据库(*.sdf).我不得不更改我的一个表格的架构,添加一个新列.
我想将新列从底部"移动"到字段列表中的不同位置.我如何在Visual Studio设计器中执行此操作?
编辑:我知道从纯粹的技术角度来看,列的顺序无关紧要.我正在为一个应用程序进行原型设计,所以我必须多次更改模式.例如,如果我必须更改主键,那么在最后使用最重要的列会"丑陋".我认为,其他看待代码的开发人员会感到困惑.这是一个美学问题.
我似乎找不到它的工具,也不是odbc驱动程序.
谢谢
更新:我知道sql脚本的可能性.但不止于此:如何编写sql 2k表的脚本?(不只是ddl,还有数据?)
当然你可以自己写这些,但是将数据导入CE不是那么麻烦,或者可以吗?
更新2:我似乎无法选择正确的方言进行插入
由于Linq-to-Entities(EF4)和Linq-to-Objects之间存在潜在差异,我需要使用实际数据库来确保我的查询类正确地从EF检索数据.Sql CE 4似乎是完美的工具,但是我遇到了一些小问题.这些测试使用的是MsTest.
我遇到的问题是如果没有重新创建数据库(由于模型更改),数据会在每次测试后不断添加到数据库中,而不会删除数据.这可能会导致测试中的冲突,查询返回的数据多于预期.
我的第一个想法是TransactionScope在TestInitialize方法中初始化a ,并将事务处理掉TestCleanup.不幸的是,Sql CE4不支持事务.
我的下一个想法是TestCleanup通过File.Delete()电话删除数据库.不幸的是,这似乎在第一次测试运行后不起作用,因为第一次测试TestCleanup似乎删除了数据库,但是第一次测试之后的每次测试似乎都没有重新创建数据库,因此它给出了数据库文件的错误找不到.
我试图改变TestInitialize和TestCleanup标签ClassInitialize,并ClassCleanup为我的测试类,但有差错NullReferenceException,由于运行前的测试ClassInitialize(或使其出现. ClassInitialize在基类,所以也许这是造成它).
我已经没有办法有效地使用Sql CE4进行测试.有没有人有更好的想法?
context.Database.Delete()和context.Database.Create().单元测试运行速度稍慢,但现在我可以使用真实数据库进行有效的单元测试
TransactionScope现在允许在SqlCE中使用最新版本的SqlCE.但是,如果您使用EF4,则必须在启动事务之前显式打开数据库连接.以下代码显示了如何成功使用Sql CE进行单元/功能测试的示例:
[TestMethod]
public void My_SqlCeScenario ()
{
using (var context = new MySQLCeModelContext()) //ß derived from DbContext
{
ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext;
objctx.Connection.Open(); //ß Open your connection explicitly
using (TransactionScope tx = new …Run Code Online (Sandbox Code Playgroud) c# unit-testing functional-testing sql-server-ce entity-framework-4
我已经为visual studio 2010安装了sp1并安装了sql server ce 4 runtime.但仍然无法使用标准数据提供程序创建与sql ce数据库的连接.
这就是我的Select DataProvider Dialog现在的样子.

PS不知道它是否重要,但我已经使用控制台应用程序和winforms应用程序测试了这两个目标.Net 4.0
如果有人可以发布一个示例nlog.config以便在SQL Server Compact 4.0中使用nlog,我将不胜感激.
我可以输出到控制台和文件确定.我已经尝试了各种dbProviders和connectionStrings,但似乎没有任何工作.
提前致谢.
艾伦T.
我已经为此尝试了谷歌.我已经安装了SQL Server CE 4.0,并且有EF 4.1,但我无法获得正确的连接字符串.什么都不connectionstrings.com适用于我.
我只想创建一个SqlCeEngine对象,但无论我尝试什么,我都会遇到一些异常.最近一直是
连接字符串中的未知连接选项
使用"元数据","应用程序","提供程序"或"提供程序连接字符串"之后.我知道EF需要连接字符串中的元数据.我无法想象如果没有"提供者连接字符串",任何事情都可以做到.
到目前为止我有这个:
<add name="DBContext"
connectionString="provider connection string="Data Source=MyDbFile.sdf;Persist Security Info=False;""
providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
有一次,我用元数据:
<add name="DBContext"
connectionString="metadata=res://*/Data.DBContext.csdl|res://*/Data.DBContext.ssdl|res://*/Data.DBContext.msl;provider=System.Data.SqlClient;provider connection string="Data Source=MyDbFile.sdf;Persist Security Info=False;""
providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
它是否需要元数据?什么在连接字符串的"app"部分?提供者应该是什么,System.Data.SqlClient或者某些SQL Server CE版本?(当我尝试添加引用时,我仍然找不到.我的添加引用窗口仍然只包含System.Data.SqlServerCe版本3.5.1.0.)或者什么都没有?
该providerName属性应该包含哪些内容?是对的System.Data.EntityClient吗?这就像这里有10个不同的变量,每个组合都给我一个新的同样神秘的错误,其中没有一个在Google上有用.我的智慧结束了.这甚至可能吗?
我无法获得实体框架来将我的域实体类与Value Objects(复杂类型)字段展平为一个表.
如果我告诉模型构建器忽略我的值对象/复杂类型,那么一切都有效,但这会导致我的表中遗漏了值对象的所有属性.一旦我删除了忽略语句,我就会得到"跨多个实体共享的值在多个位置创建".如果我查看生成的CE SQL文件,我会看到一个以我的Domain类命名的附加表,该表附加了1并且只包含Value Object参数.
一些代码:
我的域名类:
public User {
private User(){}
public long Id {get; private set;} // dont ask, inherited legacy database
public string UserId { get; private set; }
public string Domain { get; private set; }
public AuditIformation AuditDetails {get ; private set;}
//..domain logic etc
}
public AuditInformation : IValueObject {
public long CreatedByUserId { get; private set; }
public DateTime CreatedDate { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
我的存储库项目(首先是代码)得到了这个:
public partial class myContext : DbContext …Run Code Online (Sandbox Code Playgroud) 我正在评估使用EF6结合的单元测试
http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort是一个非常好的参考,但现在我卡住了.
我有2个测试项目(一个用于Effort,另一个用于SQL CE).如果我单独运行两个都很好.使用ReSharper测试运行器连续运行最后一个测试项目总是失败.或
System.InvalidOperationException:在尝试添加"已加载"事件处理程序之前,实体框架已在使用DbConfiguration实例."加载"事件处理程序只能在使用实体框架之前作为应用程序启动的一部分添加.
要么
System.InvalidOperationException:在尝试设置"SqlCeConfiguration"实例之前,实体框架使用了默认的DbConfiguration实例.在使用任何Entity Framework功能之前,必须在应用程序启动时设置"SqlCeConfiguration"实例,或者必须在应用程序的配置文件.
它总是一样的.后继继承了前一个DbConfiguration实例.如何在没有副作用的情况下运行两个测试项目/配置?
这是我的DbContext类:
public class DataContext : DbContext
{
public DataContext(string connectionString) : base(connectionString)
{ Configuration.LazyLoadingEnabled = false; }
public DataContext(DbConnection connection) : base(connection, true)
{ Configuration.LazyLoadingEnabled = false; }
}
Run Code Online (Sandbox Code Playgroud)
那是Effort的测试夹具:
[TestFixtureSetUp]
public void TestFixtureSetup()
{
EffortProviderConfiguration.RegisterProvider();
var connection = DbConnectionFactory.CreateTransient();
var dbContext = new DataContext(connection);
...
}
Run Code Online (Sandbox Code Playgroud)
这是SQL CE的测试夹具:
[TestFixtureSetUp]
public void TestFixtureSetup()
{
const string filePath = @"LocalDb.sdf"; …Run Code Online (Sandbox Code Playgroud) sql-server-ce ×10
c# ×5
unit-testing ×2
.net-4.0 ×1
database ×1
dataprovider ×1
import ×1
nlog ×1
sql-server ×1