代码优先EF4.1 + SQL Server CE4 +同步框架

时间:2011-04-26 11:28:56

标签: sql-server ef-code-first microsoft-sync-framework ef4-code-only

是否可以将CF EF4.1,SQL Server Compact 4和Microsoft Sync Framework一起使用?

正如我所知,MS Sync Framework需要SQL Server compact 3.5,但EF4.1使用SQL Server Compact 4 ...

更新 好的,我看到使用微软同步框架同步mssql ce4是不可能的。 那么可以使用mssql ce3.5作为实体框架4.1的存储吗?

5 个答案:

答案 0 :(得分:6)

Sync Framework使用其提供程序直接对数据库起作用,并且不支持开箱即用。 Sql Compact 4也是如此(参见Scenarios not enabled by Sql Compact 4

答案 1 :(得分:2)

无效 - 请参阅适用于SQL Server CE 4的this page with limitations

  

使用SQL Server进行数据复制:   Compact 4.0 不支持数据   使用同步进行SQL Server复制   框架,合并复制或远程   数据访问(RDA)。

答案 2 :(得分:2)

SQL CE 3.5不适用于Code First方法(提供程序不支持DDL生成);但是,使用EF 4.1的Model First或Database First方法应该可以正常工作。

答案 3 :(得分:2)

是的,可能 - 如果您不依赖于创建或迁移功能(EF 5.0)。

因此,首先使用app.config和命名配置

配置EF以使用SQL CE提供程序
<connectionStrings>
    <add name="TestDatabase"
         providerName="System.Data.SqlServerCe.3.5"
         connectionString="Data Source=test.sdf"/>
</connectionStrings>

public class TestDbDataContext : DbContext
{
    public TestDbDataContext() : base("TestDatabase") { }
}

在使用数据上下文之前禁用创建和迁移功能

Database.SetInitializer<TestDbDataContext>(null);

现在您可以访问数据库了。显然你必须手动创建表。

<强>警告:

插入服务器生成的密钥不适用于CE 3.5。因此,您必须在客户端管理它们(最好使用GUID来防止密钥冲突)。此外,即使您打算自己管理密钥,也需要注意。像这样定义关键

[Key]
Guid Id { get; set; }

将导致EF相信密钥是在服务器端生成的。因此,您需要使用EF的流畅API定义关键属性,以将DatabaseGeneratedOption设置为无:

this.Property(p => p.ProductId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
    .IsRequired();

this.HasKey(p => p.ProductId);

这可以在配置类(如示例中)或数据上下文的OnModelCreating函数中完成。

答案 4 :(得分:1)

根据this post,SQL Server Compact 3.5不能与Entity Framework 4.1 Code First提供程序一起使用。它可以与EF 4.1 Model First或Database First一起使用。