WinForms ile veri bağlamaDatabinding with WinForms

Bu adım adım izlenecek yol, POCO türlerinin bir "ana-ayrıntı" formunda pencere formları (WinForms) denetimlerine nasıl bağlanacağını gösterir.This step-by-step walkthrough shows how to bind POCO types to Window Forms (WinForms) controls in a “master-detail" form. Uygulama, nesneleri veritabanındaki verilerle doldurmak, değişiklikleri izlemek ve verileri veritabanına kalıcı hale getirmek için Entity Framework kullanır.The application uses Entity Framework to populate objects with data from the database, track changes, and persist data to the database.

Model bire çok ilişkiye katılan iki tür tanımlar: kategori (asıl\ana) ve ürün (bağımlı\ayrıntısı).The model defines two types that participate in one-to-many relationship: Category (principal\master) and Product (dependent\detail). Daha sonra, Visual Studio Araçları modelde tanımlanan türleri WinForms denetimlerine bağlamak için kullanılır.Then, the Visual Studio tools are used to bind the types defined in the model to the WinForms controls. WinForms veri bağlama çerçevesi ilgili nesneler arasında gezinmeyi sağlar: ana görünümdeki satırları seçme, ayrıntı görünümünün karşılık gelen alt verilerle güncelleştirilmesine neden olur.The WinForms data-binding framework enables navigation between related objects: selecting rows in the master view causes the detail view to update with the corresponding child data.

Bu izlenecek yolda ekran görüntüleri ve kod listeleri Visual Studio 2013 alınmıştır ancak Visual Studio 2012 veya Visual Studio 2010 ile bu yönergeyi tamamlayabilirsiniz.The screen shots and code listings in this walkthrough are taken from Visual Studio 2013 but you can complete this walkthrough with Visual Studio 2012 or Visual Studio 2010.

ÖnkoşullarPre-Requisites

Bu izlenecek yolu tamamlamak için Visual Studio 2013, Visual Studio 2012 veya Visual Studio 2010 yüklü olmalıdır.You need to have Visual Studio 2013, Visual Studio 2012 or Visual Studio 2010 installed to complete this walkthrough.

Visual Studio 2010 kullanıyorsanız, NuGet ' i de yüklemelisiniz.If you are using Visual Studio 2010, you also have to install NuGet. Daha fazla bilgi için bkz. NuGet 'ı yükleme.For more information, see Installing NuGet.

Uygulamayı oluşturmaCreate the Application

  • Visual Studio’yu açınOpen Visual Studio
  • Dosya-> yeni> projesi....File -> New -> Project….
  • Sağ bölmedeki sol bölmedeki ve Windows FormsApplication penceresinde Windows ' u seçinSelect Windows in the left pane and Windows FormsApplication in the right pane
  • Ad olarak Winformyüzthefsample girinEnter WinFormswithEFSample as the name
  • Tamam’ı seçinSelect OK

Entity Framework NuGet paketini yüklerInstall the Entity Framework NuGet package

  • Çözüm Gezgini, Winformyüzthefsample projesine sağ tıklayınIn Solution Explorer, right-click on the WinFormswithEFSample project
  • NuGet Paketlerini Yönet... seçeneğini belirleyin.Select Manage NuGet Packages…
  • NuGet Paketlerini Yönet iletişim kutusunda çevrimiçi sekmesini seçin ve EntityFramework paketini seçinIn the Manage NuGet Packages dialog, Select the Online tab and choose the EntityFramework package
  • Install 'a tıklayınClick Install

    Not

    EntityFramework derlemesine ek olarak, System. ComponentModel. Dataaçıklamalarda bir başvuru de eklenir.In addition to the EntityFramework assembly a reference to System.ComponentModel.DataAnnotations is also added. Projenin System. Data. Entity başvurusu varsa, EntityFramework paketi yüklendiğinde kaldırılır.If the project has a reference to System.Data.Entity, then it will be removed when the EntityFramework package is installed. System. Data. Entity derlemesi artık Entity Framework 6 uygulamaları için kullanılmıyor.The System.Data.Entity assembly is no longer used for Entity Framework 6 applications.

Koleksiyonlar için ISource uygulamaImplementing IListSource for Collections

Windows Forms kullanılırken sıralama ile iki yönlü veri bağlamayı etkinleştirmek için koleksiyon özelliklerinin ISource arabirimini uygulaması gerekir.Collection properties must implement the IListSource interface to enable two-way data binding with sorting when using Windows Forms. Bunu yapmak için ObservableCollection ISource işlevselliği eklemek üzere genişletireceğiz.To do this we are going to extend ObservableCollection to add IListSource functionality.

  • Projeye bir ObservableListSource sınıfı ekleyin:Add an ObservableListSource class to the project:
    • Proje adına sağ tıklayınRight-click on the project name
    • > yeni öğe Ekle ' yi seçinSelect Add -> New Item
    • Sınıf adı için Class ' ı seçin ve ObservableListSource girinSelect Class and enter ObservableListSource for the class name
  • Varsayılan olarak oluşturulan kodu aşağıdaki kodla değiştirin:Replace the code generated by default with the following code:

Bu sınıf iki yönlü veri bağlamayı ve sıralamayı mümkün kılmaktadır. Sınıf, ObservableCollection<T> öğesinden türetilir ve ISource 'un açık bir uygulamasını ekler. ISource 'un GetList () yöntemi, ObservableCollection ile eşitlenmiş bir IBindingList uygulamasını döndürecek şekilde uygulanır. ToBindingList tarafından oluşturulan IBindingList uygulamasının sıralamayı destekler. ToBindingList Extension yöntemi EntityFramework derlemesinde tanımlanmıştır.This class enables two-way data binding as well as sorting. The class derives from ObservableCollection<T> and adds an explicit implementation of IListSource. The GetList() method of IListSource is implemented to return an IBindingList implementation that stays in sync with the ObservableCollection. The IBindingList implementation generated by ToBindingList supports sorting. The ToBindingList extension method is defined in the EntityFramework assembly.

    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Diagnostics.CodeAnalysis;
    using System.Data.Entity;

    namespace WinFormswithEFSample
    {
        public class ObservableListSource<T> : ObservableCollection<T>, IListSource
            where T : class
        {
            private IBindingList _bindingList;

            bool IListSource.ContainsListCollection { get { return false; } }

            IList IListSource.GetList()
            {
                return _bindingList ?? (_bindingList = this.ToBindingList());
            }
        }
    }

Model tanımlamaDefine a Model

Bu izlenecek yolda, Code First veya EF tasarımcısını kullanarak bir model uygulamayı seçebilirsiniz.In this walkthrough you can chose to implement a model using Code First or the EF Designer. Aşağıdaki iki bölümden birini doldurun.Complete one of the two following sections.

Seçenek 1: Code First kullanarak model tanımlamaOption 1: Define a Model using Code First

Bu bölümde, Code First kullanarak bir modelin ve ilişkili veritabanının nasıl oluşturulacağı gösterilmektedir.This section shows how to create a model and its associated database using Code First. Bir sonraki bölüme atlayın (seçenek 2: Database First kullanarak bir model tanımlayın) , bir VERITABANıNDAN, EF Designer kullanarak modelinize ters mühendislik uygulamak için Database First kullanmayı tercih ediyorsanızSkip to the next section (Option 2: Define a model using Database First) if you would rather use Database First to reverse engineer your model from a database using the EF designer

Code First geliştirme kullanılırken, genellikle kavramsal (etki alanı) modelinizi tanımlayan .NET Framework sınıfları yazarak başlarsınız.When using Code First development you usually begin by writing .NET Framework classes that define your conceptual (domain) model.

  • Projeye yeni bir ürün sınıfı ekleyinAdd a new Product class to project
  • Varsayılan olarak oluşturulan kodu aşağıdaki kodla değiştirin:Replace the code generated by default with the following code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace WinFormswithEFSample
    {
        public class Product
        {
            public int ProductId { get; set; }
            public string Name { get; set; }

            public int CategoryId { get; set; }
            public virtual Category Category { get; set; }
        }
    }
  • Projeye bir Kategori sınıfı ekleyin.Add a Category class to the project.
  • Varsayılan olarak oluşturulan kodu aşağıdaki kodla değiştirin:Replace the code generated by default with the following code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace WinFormswithEFSample
    {
        public class Category
        {
            private readonly ObservableListSource<Product> _products =
                    new ObservableListSource<Product>();

            public int CategoryId { get; set; }
            public string Name { get; set; }
            public virtual ObservableListSource<Product> Products { get { return _products; } }
        }
    }

Varlıkları tanımlamaya ek olarak, DbContext 'ten türeten bir sınıf tanımlamanız ve Dbset<TEntity> özelliklerini kullanıma sunabilmeniz gerekir.In addition to defining entities, you need to define a class that derives from DbContext and exposes DbSet<TEntity> properties. Dbset özellikleri bağlamın modele hangi türleri dahil etmek istediğinizi bilmesini sağlar.The DbSet properties let the context know which types you want to include in the model. DbContext ve Dbset türleri EntityFramework derlemesinde tanımlanmıştır.The DbContext and DbSet types are defined in the EntityFramework assembly.

DbContext türetilmiş türünün bir örneği, çalışma zamanı sırasında varlık nesnelerini yönetir, bu da nesneleri bir veritabanındaki verilerle doldurmayı, değişiklik izlemeyi ve kalıcı verileri veritabanına getirmeyi içerir.An instance of the DbContext derived type manages the entity objects during run time, which includes populating objects with data from a database, change tracking, and persisting data to the database.

  • Projeye yeni bir Productcontext sınıfı ekleyin.Add a new ProductContext class to the project.
  • Varsayılan olarak oluşturulan kodu aşağıdaki kodla değiştirin:Replace the code generated by default with the following code:
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Text;

    namespace WinFormswithEFSample
    {
        public class ProductContext : DbContext
        {
            public DbSet<Category> Categories { get; set; }
            public DbSet<Product> Products { get; set; }
        }
    }

Projeyi derleyin.Compile the project.

Seçenek 2: Database First kullanarak model tanımlamaOption 2: Define a model using Database First

Bu bölümde, EF Designer kullanarak bir veritabanından modelinize ters mühendislik uygulamak için Database First nasıl kullanılacağı gösterilmektedir.This section shows how to use Database First to reverse engineer your model from a database using the EF designer. Önceki bölümü (1. seçenek: Code First kullanarak model tanımlama) tamamladıysanız, bu bölümü atlayın ve doğrudan geç yükleme bölümüne gidin.If you completed the previous section (Option 1: Define a model using Code First), then skip this section and go straight to the Lazy Loading section.

Var olan bir veritabanı oluşturCreate an Existing Database

Genellikle, var olan bir veritabanını hedeflerken zaten oluşturulur, ancak bu izlenecek yol için, erişmek üzere bir veritabanı oluşturulması gerekir.Typically when you are targeting an existing database it will already be created, but for this walkthrough we need to create a database to access.

Visual Studio ile yüklenen veritabanı sunucusu, yüklediğiniz Visual Studio sürümüne bağlı olarak farklılık gösteren bir sürümdür:The database server that is installed with Visual Studio is different depending on the version of Visual Studio you have installed:

  • Visual Studio 2010 kullanıyorsanız, bir SQL Express veritabanı oluşturursunuz.If you are using Visual Studio 2010 you'll be creating a SQL Express database.
  • Visual Studio 2012 kullanıyorsanız, LocalDB veritabanı oluşturursunuz.If you are using Visual Studio 2012 then you'll be creating a LocalDB database.

Şimdi veritabanını oluşturalım.Let's go ahead and generate the database.

  • > Sunucu Gezgini görüntüleView -> Server Explorer

  • Veri bağlantıları ' na sağ tıklayın > bağlantı ekle...Right click on Data Connections -> Add Connection…

  • Sunucu Gezgini bir veritabanına bağlı değilseniz, veri kaynağı olarak Microsoft SQL Server seçmeniz gerekirIf you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

    Veri kaynağını Değiştir

  • Hangisini yüklediğinize bağlı olarak LocalDB 'ye veya SQL Express 'e bağlanın ve veritabanı adı olarak ürünleri girinConnect to either LocalDB or SQL Express, depending on which one you have installed, and enter Products as the database name

    Bağlantı LocalDB Ekle

    Bağlantı Express ekleme

  • Tamam ' ı seçtiğinizde, yeni bir veritabanı oluşturmak isteyip istemediğiniz sorulur, Evet ' i seçin.Select OK and you will be asked if you want to create a new database, select Yes

    Veritabanı Oluşturma

  • Yeni veritabanı artık Sunucu Gezgini görüntülenir, sağ tıklayıp Yeni sorgu ' yı seçin.The new database will now appear in Server Explorer, right-click on it and select New Query

  • Aşağıdaki SQL 'i yeni sorguya kopyalayın, ardından sorguya sağ tıklayıp Yürüt ' ü seçin.Copy the following SQL into the new query, then right-click on the query and select Execute

    CREATE TABLE [dbo].[Categories] (
        [CategoryId] [int] NOT NULL IDENTITY,
        [Name] [nvarchar](max),
        CONSTRAINT [PK_dbo.Categories] PRIMARY KEY ([CategoryId])
    )

    CREATE TABLE [dbo].[Products] (
        [ProductId] [int] NOT NULL IDENTITY,
        [Name] [nvarchar](max),
        [CategoryId] [int] NOT NULL,
        CONSTRAINT [PK_dbo.Products] PRIMARY KEY ([ProductId])
    )

    CREATE INDEX [IX_CategoryId] ON [dbo].[Products]([CategoryId])

    ALTER TABLE [dbo].[Products] ADD CONSTRAINT [FK_dbo.Products_dbo.Categories_CategoryId] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[Categories] ([CategoryId]) ON DELETE CASCADE

Tersine mühendislik modeliReverse Engineer Model

Modelimizi oluşturmak için Visual Studio 'nun bir parçası olarak dahil edilen Entity Framework Designer kullanacağız.We’re going to make use of Entity Framework Designer, which is included as part of Visual Studio, to create our model.

  • Proje-> yeni öğe Ekle...Project -> Add New Item…

  • Sol menüden verileri seçin ve ardından ADO.net varlık veri modeliSelect Data from the left menu and then ADO.NET Entity Data Model

  • Ad olarak ProductModel girin ve Tamam 'a tıklayınEnter ProductModel as the name and click OK

  • Bu, varlık veri modeli Sihirbazı 'nı başlatırThis launches the Entity Data Model Wizard

  • Veritabanından oluştur ' u seçin ve İleri ' ye tıklayın.Select Generate from Database and click Next

    ChooseModelContents

  • İlk bölümde oluşturduğunuz veritabanına bağlantıyı seçin, bağlantı dizesinin adı olarak Productcontext girin ve İleri ' ye tıklayın.Select the connection to the database you created in the first section, enter ProductContext as the name of the connection string and click Next

    Bağlantınızı seçin

  • Tüm tabloları içeri aktarmak için ' tablolar ' seçeneğinin yanındaki onay kutusuna tıklayın ve ' son ' a tıklayınClick the checkbox next to ‘Tables’ to import all tables and click ‘Finish’

    Nesnelerinizi seçin

Tersine mühendislik işlemi tamamlandıktan sonra, yeni model projenize eklenir ve Entity Framework Designer görüntülemeniz için açılır.Once the reverse engineer process completes the new model is added to your project and opened up for you to view in the Entity Framework Designer. Veritabanına yönelik bağlantı ayrıntılarına sahip bir App. config dosyası da projenize eklenmiştir.An App.config file has also been added to your project with the connection details for the database.

Visual Studio 2010 ' de ek adımlarAdditional Steps in Visual Studio 2010

Visual Studio 2010 ' de çalışıyorsanız, EF6 kod oluşturmayı kullanmak için EF tasarımcısını güncelleştirmeniz gerekir.If you are working in Visual Studio 2010 then you will need to update the EF designer to use EF6 code generation.

  • EF Designer 'daki modelinizin boş bir noktasına sağ tıklayıp kod oluşturma öğesi Ekle... seçeneğini belirleyin.Right-click on an empty spot of your model in the EF Designer and select Add Code Generation Item…
  • Sol menüden çevrimiçi şablonlar ' ı seçin ve DbContext ' i arayınSelect Online Templates from the left menu and search for DbContext
  • C#Için EF 6. x DbContext oluşturucusunu seçin, ad olarak productsmodel girin ve Ekle ' ye tıklayın.Select the EF 6.x DbContext Generator for C#, enter ProductsModel as the name and click Add

Veri bağlama için kod üretimi güncelleştiriliyorUpdating code generation for data binding

EF, modelden T4 şablonları kullanarak kod oluşturur.EF generates code from your model using T4 templates. Visual Studio ile birlikte gelen veya Visual Studio galerisinden indirilen şablonlar genel amaçlı kullanım amaçlıdır.The templates shipped with Visual Studio or downloaded from the Visual Studio gallery are intended for general purpose use. Bu, bu şablonlardan oluşturulan varlıkların basit ICollection<T> özelliklerine sahip olduğu anlamına gelir.This means that the entities generated from these templates have simple ICollection<T> properties. Ancak, veri bağlama yaparken ISource 'u uygulayan koleksiyon özelliklerinin olması tercih edilir.However, when doing data binding it is desirable to have collection properties that implement IListSource. Bu nedenle, yukarıdaki ObservableListSource sınıfını oluşturuyoruz ve artık bu sınıftan kullanımı sağlamak için şablonları değiştirebiliyoruz.This is why we created the ObservableListSource class above and we are now going to modify the templates to make use of this class.

  • Çözüm Gezgini açın ve ProductModel. edmx dosyasını bulunOpen the Solution Explorer and find ProductModel.edmx file

  • ProductModel. edmx dosyasının altında iç içe olacak ProductModel.tt dosyasını bulunFind the ProductModel.tt file which will be nested under the ProductModel.edmx file

    Ürün modeli şablonu

  • Visual Studio Düzenleyicisi 'nde açmak için ProductModel.tt dosyasına çift tıklayınDouble-click on the ProductModel.tt file to open it in the Visual Studio editor

  • "ICollection" sözcüğünün iki yinelemesini "ObservableListSource" ile bulur ve değiştirin.Find and replace the two occurrences of “ICollection” with “ObservableListSource”. Bunlar yaklaşık olarak 296 ve 484 satırlarında bulunur.These are located at approximately lines 296 and 484.

  • İlk "HashSet" oluşumunu "ObservableListSource" ile bulur ve değiştirin.Find and replace the first occurrence of “HashSet” with “ObservableListSource”. Bu oluşum yaklaşık satır 50 ' de bulunur.This occurrence is located at approximately line 50. Kodda daha sonra bulunan ikinci diyez kümesi oluşumunu değiştirmeyin.Do not replace the second occurrence of HashSet found later in the code.

  • ProductModel.tt dosyasını kaydedin.Save the ProductModel.tt file. Bu, varlıkların kodunun yeniden üretilmesine neden olmalıdır.This should cause the code for entities to be regenerated. Kod otomatik olarak yeniden oluşturmaz, ProductModel.tt 'e sağ tıklayın ve "özel araç Çalıştır" seçeneğini belirleyin.If the code does not regenerate automatically, then right click on ProductModel.tt and choose “Run Custom Tool”.

Artık Category.cs dosyasını (ProductModel.tt altında iç içe yerleştirilmiş) açarsanız, Products koleksiyonunun ObservableListSource<ürün> türünde olduğunu görmeniz gerekir.If you now open the Category.cs file (which is nested under ProductModel.tt) then you should see that the Products collection has the type ObservableListSource<Product>.

Projeyi derleyin.Compile the project.

Geç yüklemeLazy Loading

Product sınıfında category sınıfı ve category özelliğindeki Products özelliği gezinti özellikleridir.The Products property on the Category class and Category property on the Product class are navigation properties. Entity Framework, gezinti özellikleri iki varlık türü arasında bir ilişkiye gitmek için bir yol sağlar.In Entity Framework, navigation properties provide a way to navigate a relationship between two entity types.

EF, gezinti özelliğine ilk kez eriştiğinizde ilgili varlıkları veritabanından otomatik olarak yükleme seçeneği sunar.EF gives you an option of loading related entities from the database automatically the first time you access the navigation property. Bu yükleme türü (yavaş yükleme olarak adlandırılır) ile, her gezinti özelliğine ilk kez eriştiğinizde, içerik bağlamda değilse veritabanına karşı ayrı bir sorgu yürütülecektir.With this type of loading (called lazy loading), be aware that the first time you access each navigation property a separate query will be executed against the database if the contents are not already in the context.

POCO varlık türleri kullanılırken, EF, çalışma zamanı sırasında türetilmiş proxy türlerinin örneklerini oluşturarak ve sonra yükleme kancasını eklemek için sınıflarınızda sanal özellikleri geçersiz kılarak geç yüklemeye erişir.When using POCO entity types, EF achieves lazy loading by creating instances of derived proxy types during runtime and then overriding virtual properties in your classes to add the loading hook. İlgili nesnelerin geç yüklemesini almak için, gezinti özelliği alıcıları ' ı Public ve Virtual (Visual Basic) olarak bildirmeniz ve sınıfınız mühürlenmemelidir (Visual Basic içindeNotOverridable ).To get lazy loading of related objects, you must declare navigation property getters as public and virtual (Overridable in Visual Basic), and you class must not be sealed (NotOverridable in Visual Basic). Database First gezinti özelliklerinin kullanılması, yavaş yüklemeyi etkinleştirmek için otomatik olarak sanal hale getirilir.When using Database First navigation properties are automatically made virtual to enable lazy loading. Code First bölümünde, aynı nedenden dolayı gezinti özelliklerini sanal hale getirmeyi seçtikIn the Code First section we chose to make the navigation properties virtual for the same reason

Nesneyi denetimlere bağlamaBind Object to Controls

Bu WinForms uygulaması için modelde tanımlanan sınıfları veri kaynağı olarak ekleyin.Add the classes that are defined in the model as data sources for this WinForms application.

  • Ana menüden Proje-> yeni veri kaynağı Ekle... öğesini seçin.From the main menu, select Project -> Add New Data Source … (Visual Studio 2010 ' de, veri> yeni veri kaynağı Ekle... ' i seçmeniz gerekir.)(in Visual Studio 2010, you need to select Data -> Add New Data Source…)

  • Veri kaynağı türü seçin penceresinde, nesne ' yi seçin ve İleri ' ye tıklayın.In the Choose a Data Source Type window, select Object and click Next

  • Veri nesnelerini seçin iletişim kutusunda, Winformyüzthefsample 'ın iki kez katlamayı kaldırın ve Kategori ' yi seçin. Bu, ürün veri kaynağını seçmek zorunda kalmaz.In the Select the Data Objects dialog, unfold the WinFormswithEFSample two times and select Category There is no need to select the Product data source, because we will get to it through the Product’s property on the Category data source.

    Veri Kaynağı

  • Son'a tıklayın.Click Finish. Veri kaynakları penceresi gösterilmiyorsa, diğer Windows> veri kaynaklarını> görüntüle ' yi seçin.If the Data Sources window is not showing up, select View -> Other Windows-> Data Sources

  • Veri kaynakları penceresi otomatik olarak gizlenmemesi için Sabitle simgesine basın.Press the pin icon, so the Data Sources window does not auto hide. Pencere zaten görünür durumdaysa Yenile düğmesine vurması gerekebilir.You may need to hit the refresh button if the window was already visible.

    Veri kaynağı 2

  • Çözüm Gezgini, tasarımcıda ana formu açmak için Form1.cs dosyasına çift tıklayın.In Solution Explorer, double-click the Form1.cs file to open the main form in designer.

  • Kategori veri kaynağını seçin ve form üzerine sürükleyin.Select the Category data source and drag it on the form. Varsayılan olarak, tasarımcıya yeni bir DataGridView (Categorydatagridview) ve gezinti araç çubuğu denetimleri eklenir.By default, a new DataGridView (categoryDataGridView) and Navigation toolbar controls are added to the designer. Bu denetimler, ayrıca oluşturulan BindingSource (Categorybindingsource) ve bağlama Gezgini (categorybindingnavigator) bileşenlerine bağımlıdır.These controls are bound to the BindingSource (categoryBindingSource) and Binding Navigator (categoryBindingNavigator) components that are created as well.

  • Categorydatagridviewüzerinde sütunları düzenleyin.Edit the columns on the categoryDataGridView. CategoryID sütununu salt okunurdur olarak ayarlamak istiyoruz.We want to set the CategoryId column to read-only. Verileri kaydettikten sonra CategoryID özelliğinin değeri veritabanı tarafından oluşturulur.The value for the CategoryId property is generated by the database after we save the data.

    • DataGridView denetimine sağ tıklayıp sütunları Düzenle... seçeneğini belirleyin.Right-click the DataGridView control and select Edit Columns…
    • CategoryID sütununu seçin ve ReadOnly değerini true olarak ayarlayınSelect the CategoryId column and set ReadOnly to True
    • Tamam 'a basınPress OK
  • Kategori veri kaynağı altında products ' ı seçin ve forma sürükleyin.Select Products from under the Category data source and drag it on the form. ProductDataGridView ve productBindingSource forma eklenir.The productDataGridView and productBindingSource are added to the form.

  • ProductDataGridView üzerinde sütunları düzenleyin.Edit the columns on the productDataGridView. CategoryID ve category sütunlarını gizlemek ve ProductID 'yi salt okunurdur olarak ayarlamak istiyoruz.We want to hide the CategoryId and Category columns and set ProductId to read-only. Verileri kaydettikten sonra ProductID özelliğinin değeri veritabanı tarafından oluşturulur.The value for the ProductId property is generated by the database after we save the data.

    • DataGridView denetimine sağ tıklayıp Sütunları Düzenle... seçeneğini belirleyin.Right-click the DataGridView control and select Edit Columns....
    • ProductID sütununu seçin ve ReadOnly değerini trueolarak ayarlayın.Select the ProductId column and set ReadOnly to True.
    • CategoryID sütununu seçin ve Kaldır düğmesine basın.Select the CategoryId column and press the Remove button. Kategori sütunuyla aynısını yapın.Do the same with the Category column.
    • Tamam'a basın.Press OK.

    Şimdiye kadar, tasarımcı 'daki BindingSource bileşenleriyle DataGridView denetimlerimizi ilişkilendirdik.So far, we associated our DataGridView controls with BindingSource components in the designer. Sonraki bölümde, categoryBindingSource. DataSource öğesini DbContext tarafından izlenmekte olan varlıkların koleksiyonuna ayarlamak için arkasındaki koda kod ekleyeceğiz.In the next section we will add code to the code behind to set categoryBindingSource.DataSource to the collection of entities that are currently tracked by DbContext. Kategori altındaki ürünleri sürüklediğimiz ve bıraktığı zaman, WinForms, productsBindingSource. DataSource özelliğini Products BindingSource ve productsBindingSource. DataMember özelliğine ayarlamamız gerekir.When we dragged-and-dropped Products from under the Category, the WinForms took care of setting up the productsBindingSource.DataSource property to categoryBindingSource and productsBindingSource.DataMember property to Products. Bu bağlama nedeniyle, yalnızca şu anda seçili olan kategoriye ait ürünler productDataGridView içinde görüntülenir.Because of this binding, only the products that belong to the currently selected Category will be displayed in the productDataGridView.

  • Sağ fare düğmesine tıklayıp etkin' i seçerek gezinti araç çubuğundaki Kaydet düğmesini etkinleştirin.Enable the Save button on the Navigation toolbar by clicking the right mouse button and selecting Enabled.

    Form 1 Tasarımcısı

  • Düğmeye çift tıklayarak Kaydet düğmesine ait olay işleyicisini ekleyin.Add the event handler for the save button by double-clicking on the button. Bu işlem olay işleyicisini ekler ve sizi form için arka plan koduna getirir.This will add the event handler and bring you to the code behind for the form. Categorybindinggezgintorsaveıtem_Click olay işleyicisi bir sonraki bölüme eklenecektir.The code for the categoryBindingNavigatorSaveItem_Click event handler will be added in the next section.

Veri etkileşimini Işleyen kodu ekleyinAdd the Code that Handles Data Interaction

Artık veri erişimi gerçekleştirmek için ProductContext kullanmak üzere kodu ekleyeceğiz.We'll now add the code to use the ProductContext to perform data access. Ana form penceresi için kodu aşağıda gösterildiği gibi güncelleştirin.Update the code for the main form window as shown below.

Kod, ProductContext 'in uzun süre çalışan bir örneğini bildirir.The code declares a long-running instance of ProductContext. Verileri sorgulamak ve veritabanına kaydetmek için ProductContext nesnesi kullanılır.The ProductContext object is used to query and save data to the database. ProductContext örneğindeki Dispose () yöntemi, geçersiz kılınan OnClosing yönteminden çağırılır.The Dispose() method on the ProductContext instance is then called from the overridden OnClosing method. Kod açıklamaları kodun ne yaptığını hakkında ayrıntılar sağlar.The code comments provide details about what the code does.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.Entity;

    namespace WinFormswithEFSample
    {
        public partial class Form1 : Form
        {
            ProductContext _context;
            public Form1()
            {
                InitializeComponent();
            }

            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);
                _context = new ProductContext();

                // Call the Load method to get the data for the given DbSet
                // from the database.
                // The data is materialized as entities. The entities are managed by
                // the DbContext instance.
                _context.Categories.Load();

                // Bind the categoryBindingSource.DataSource to
                // all the Unchanged, Modified and Added Category objects that
                // are currently tracked by the DbContext.
                // Note that we need to call ToBindingList() on the
                // ObservableCollection<TEntity> returned by
                // the DbSet.Local property to get the BindingList<T>
                // in order to facilitate two-way binding in WinForms.
                this.categoryBindingSource.DataSource =
                    _context.Categories.Local.ToBindingList();
            }

            private void categoryBindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                this.Validate();

                // Currently, the Entity Framework doesn’t mark the entities
                // that are removed from a navigation property (in our example the Products)
                // as deleted in the context.
                // The following code uses LINQ to Objects against the Local collection
                // to find all products and marks any that do not have
                // a Category reference as deleted.
                // The ToList call is required because otherwise
                // the collection will be modified
                // by the Remove call while it is being enumerated.
                // In most other situations you can do LINQ to Objects directly
                // against the Local property without using ToList first.
                foreach (var product in _context.Products.Local.ToList())
                {
                    if (product.Category == null)
                    {
                        _context.Products.Remove(product);
                    }
                }

                // Save the changes to the database.
                this._context.SaveChanges();

                // Refresh the controls to show the values         
                // that were generated by the database.
                this.categoryDataGridView.Refresh();
                this.productsDataGridView.Refresh();
            }

            protected override void OnClosing(CancelEventArgs e)
            {
                base.OnClosing(e);
                this._context.Dispose();
            }
        }
    }

Windows Forms uygulamayı test etmeTest the Windows Forms Application

  • Uygulamayı derleyin ve çalıştırın ve işlevleri test edebilirsiniz.Compile and run the application and you can test out the functionality.

    Kaydetmeden önce form 1

  • Mağaza oluşturulduktan sonra oluşturulan anahtarların ekranda gösterilmesi gösterilmektedir.After saving the store generated keys are shown on the screen.

    Kaydettikten sonra 1 formu

  • Code First kullandıysanız, sizin için bir Winformyüzthefsample. ProductContext veritabanının oluşturulduğunu da görürsünüz.If you used Code First, then you will also see that a WinFormswithEFSample.ProductContext database is created for you.

    Sunucu Nesne Gezgini