Dav*_*man 3 entity-framework sql-server-ce entity-framework-4
我开始使用Entity Framework 4,我正在创建一个演示应用程序作为学习练习.该应用程序是一个简单的文档构建器,它使用SQL CE存储.每个文档项目都有自己的SQL CE数据文件,用户打开其中一个文件来处理项目.
EDM非常简单.文档项目由主题列表组成,每个主题都有标题,描述和零个或多个注释.所以,我的实体是Subject,它包含Title和Text属性,Note,它有Title和Text属性.从Subject到Note有一对多的关联.
我试图弄清楚如何打开SQL CE数据文件.数据文件必须与EF4的创建数据库向导创建的SQL CE数据库的模式匹配,我将在应用程序的其他位置实现一个新文件用例来实现该要求.现在,我只是想在应用程序中打开现有数据文件.
我已经复制了下面现有的"打开文件"代码.我已将其设置为名为File Services的静态服务类.代码还没有完成,但足以显示我想要做的事情.我试图保持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
}
Run Code Online (Sandbox Code Playgroud)
这是答案.我简化了我的代码,并在简单的EDM模型,迪斯尼角色上运行它.模型有两个实体,Character并且Child,用1:*之间的关联关系Character和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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码顶部的链接是我用来编写代码的论坛帖子.
以下是演练:首先,创建数据库连接.由于我使用的是SQL CE,因此我没有连接字符串构建器 - 连接字符串只是一个路径,所以我不需要一个.然后我用一个EntityConnectionStringBuilder构建实体连接字符串,然后用它来构建一个EntityConnection.最后,我将连接传递给我的构造函数ObjectContext.然后我可以使用它ObjectContext来查询EDM.
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |