我看到的外键约束的问题,我得到了很多的问题是,在默认情况下,下面的约束不复制到客户端:外键约束,唯一约束和DEFAULT约束
本文档中: http://msdn.microsoft.com/en-us/library/bb726037.aspx
所以,看来我要“手动”创建的关系,一旦架构在客户端上创建的。
一旦关系已在客户端上创建的,如果我做了什么在服务器端表中的任何改变,我不得不一次又一次地重新在客户端的所有关系。 是不是会很头疼。 反正是有编写代码或脚本来创建可刚复制的客户端外键约束。 如果我们做,可以在客户端通过改变脚本来完成服务器端表架构进行任何更改。
我现在用的样品的修改版本http://code.msdn.microsoft.com/Database-Sync-SQL-Server-7e88adab#content的SQL Server Express在WCF服务到SQL Server。
我使用的脚本从SQL管理局生成ALTER TABLE脚本添加所有的外键http://blog.sqlauthority.com/2008/04/18/sql-server-generate-foreign-key-scripts-for-database /
当客户端调用WCF服务GetScopeDescription()来得到我运行上面的存储过程把所有的外键关系添加的客户端架构。 该SQL脚本返回我把在DbSyncScopeDescription.UserComment领域,其持有的脚本,并在同一时间架构它传输到客户端的字符串。 然后客户端同步范围/模式后,我可以运行该脚本生成的关系。
DbSyncScopeDescription dbSyncScopeDescription = sqlSyncProviderProxy.GetScopeDescription();
sqlSyncScopeProvisioning.PopulateFromScopeDescription(dbSyncScopeDescription);
sqlSyncScopeProvisioning.Apply();
string alterDatabaseScript = dbSyncScopeDescription.UserComment;
这是专门针对静态数据库架构/关系。 当需要架构/关系的修改,我会首先删除客户端数据库。
同步框架犯规自动拾取到正在同步的表做架构更改。 不管它只是一个FK,列名/类型/长度的变化,你必须要重新设置(除非你想破解的同步对象的方式)。
如果你想完整的模式保真度,我建议你创建数据库对象自己(表,约束,SP,触发器,等...),而不是让自己同步创建表给你。
和顺便说一句,没有同步框架4.0
我简单的方法来添加外键约束只是让外键的SQL命令的txt文件,并给“;” 每个SQL命令后,用下面的代码它完美...
private void FunAddForeignKeys()
{
SqlConnection clientConn = new SqlConnection(lconString);
if (clientConn.State == ConnectionState.Closed)
clientConn.Open();
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(GetSql("ForeignKeyQueries.txt"), clientConn);
try
{
Command.ExecuteNonQuery();
MessageBox.Show("Foreign keys added");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
// Closing the connection should be done in a Finally block
clientConn.Close();
}
}
private string GetSql(string Name)
{
try
{
// Gets the current assembly.
Assembly Asm = Assembly.GetExecutingAssembly();
// Resources are named using a fully qualified name.
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);
// Reads the contents of the embedded file.
StreamReader reader = new StreamReader(strm);
return reader.ReadToEnd();
}
catch (Exception ex)
{
MessageBox.Show("In GetSQL: " + ex.Message);
throw ex;
}
}
我已经得到了通过同步创建客户端表,然后添加代码来生成外键约束的解决方案。 其简单的方法,而不是生成所有表自己,然后添加约束他们。 只是复制线关系,仅此而已。