문제

Entity Framework 4를 시작하고 학습 운동으로 데모 앱을 만들고 있습니다. 이 앱은 간단한 문서 빌더이며 SQL CE 상점을 사용합니다. 각 문서 프로젝트에는 자체 SQL CE 데이터 파일이 있으며 사용자는 이러한 파일 중 하나를 엽니 다.

EDM은 매우 간단합니다. 문서 프로젝트는 주제 목록으로 구성되며 각 주제는 제목, 설명 및 0 이상의 메모를 갖습니다. 따라서 내 엔티티는 제목과 텍스트 속성과 제목과 텍스트 속성이 포함 된 주제입니다. 주목할만한 일대일 협회가 있습니다.

SQL CE 데이터 파일을 여는 방법을 알아 내려고합니다. 데이터 파일은 EF4의 Create Database Wizard에서 만든 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 그리고 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();
        }
    }
}

코드 상단의 링크는 코드를 작성하는 데 사용한 포럼 스레드입니다.

연습은 다음과 같습니다. 먼저 데이터베이스 연결을 만듭니다. SQL CE를 사용하고 있으므로 연결 문자열 빌더가 없습니다. 연결 문자열은 단순히 경로이므로 필요하지 않습니다. 그런 다음 an을 사용합니다 EntityConnectionStringBuilder 엔티티 연결 문자열을 빌드 한 다음이를 구축하는 데 사용합니다. EntityConnection. 마지막으로, 나는 나의 생성자에 대한 연결을 내 ObjectContext. 그런 다음 사용할 수 있습니다 ObjectContext EDM을 쿼리하기 위해.

다른 팁

SQL Server CE 데이터베이스 찾기 / 열기는 이상한 이유가 있습니다. 하기가 어렵습니다. EF와 함께 작동하기 전에 DB에 전혀 연결할 수 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top