我正在开始使用 Entity Framework 4,并创建一个演示应用程序作为学习练习。该应用程序是一个简单的文档生成器,它使用 SQL CE 存储。每个文档项目都有自己的 SQL CE 数据文件,用户打开这些文件之一来处理项目。
EDM 非常简单。文档项目由主题列表组成,每个主题都有标题、描述和零个或多个注释。因此,我的实体是主题(包含标题和文本属性)和注释(包含标题和文本属性)。从主题到注释存在一对多关联。
我想弄清楚如何打开 SQL CE 数据文件。数据文件必须与 EF4 的创建数据库向导创建的 SQL CE 数据库的架构相匹配,我将在应用程序的其他位置实现一个新文件用例来实现该要求。现在,我只是想在应用程序中打开现有的数据文件。
我在下面复制了现有的“打开文件”代码。我已将其设置为静态服务类,名为文件服务。该代码尚未正常工作,但足以显示我正在尝试做的事情。我试图保持 ObjectContext 打开以进行实体对象更新,并在文件关闭时将其处置。
所以,这是我的问题:我走在正确的道路上吗?我需要更改什么才能使此代码与 EF4 兼容?有一个如何正确执行此操作的示例吗?
感谢您的帮助。
我现有的代码:
public static class FileServices
{
#region Private Fields
// Member variables
private static EntityConnection m_EntityConnection;
private static ObjectContext m_ObjectContext;
#endregion
#region Service Methods
/// <summary>
/// Opens an SQL CE database file.
/// </summary>
/// <param name="filePath">The path to the SQL CE file to open.</param>
/// <param name="viewModel">The main window view model.</param>
public static void OpenSqlCeFile(string filePath, MainWindowViewModel viewModel)
{
// Configure an SQL CE connection string
var sqlCeConnectionString = string.Format("Data Source={0}", filePath);
// Configure an EDM connection string
var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/EF4Model.csdl|res://*/EF4Model.ssdl|res://*/EF4Model.msl";
builder.Provider = "System.Data.SqlServerCe";
builder.ProviderConnectionString = sqlCeConnectionString;
var entityConnectionString = builder.ToString();
// Connect to the model
m_EntityConnection = new EntityConnection(entityConnectionString);
m_EntityConnection.Open();
// Create an object context
m_ObjectContext = new Model1Container();
// Get all Subject data
IQueryable<Subject> subjects = from s in Subjects orderby s.Title select s;
// Set view model data property
viewModel.Subjects = new ObservableCollection<Subject>(subjects);
}
/// <summary>
/// Closes an SQL CE database file.
/// </summary>
public static void CloseSqlCeFile()
{
m_EntityConnection.Close();
m_ObjectContext.Dispose();
}
#endregion
}
这就是答案。我简化了代码并在更简单的 EDM 模型上运行它,迪士尼人物。模型有两个实体,Character
and Child
,之间有 1:* 关联Character
and Child
。孩子就是角色的孩子——很简单的事情。我将演示编写为控制台应用程序,以使其尽可能简单。
完整代码在Program.cs
如下:
class Program
{
static void Main(string[] args)
{
/* See http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8a89a728-6c8d-4734-98cb-11b196ba11fd */
// Configure an SQL CE connection string
var filePath = @"D:\Users\dcveeneman\Documents\Visual Studio 2010\Demos\SqlCeEf4Demo\SqlCeEf4Demo\DisneyChars.sdf";
var sqlCeConnectionString = string.Format("Data Source={0}", filePath);
// Create an EDM connection
var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/DisneyChars.csdl|res://*/DisneyChars.ssdl|res://*/DisneyChars.msl";
builder.Provider = "System.Data.SqlServerCe.3.5";
builder.ProviderConnectionString = sqlCeConnectionString;
var edmConnectionString = builder.ToString();
var edmConnection = new EntityConnection(edmConnectionString);
// Build and query an ObjectContext
using (var context = new DisneyCharsContainer(edmConnection))
{
var chars = context.Characters;
foreach(var character in chars)
{
Console.WriteLine("Character name: {0}", character.Name);
foreach(var child in character.Children)
{
Console.WriteLine("Child name: {0}", child.Name);
}
}
Console.ReadLine();
}
}
}
代码顶部的链接是我用来编写代码的论坛线程。
演练如下:首先,创建数据库连接。由于我使用的是 SQL CE,因此没有连接字符串生成器——连接字符串只是一条路径,因此我不需要它。然后我用一个EntityConnectionStringBuilder
构建一个实体连接字符串,然后我用它来构建一个EntityConnection
。最后,我将连接传递给我的构造函数ObjectContext
。然后我可以使用ObjectContext
查询 EDM。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)