Как я могу сохранить внешний ключ, используя Entity Framework? - PullRequest
1 голос
/ 28 октября 2010

первый фон.Вот сценарий SQLite, который я создал:

create table Person(
ID integer not null primary key autoincrement,
Name text not null
);

create table Department(
ID integer not null primary key autoincrement,
Name text not null,
Leader integer not null references Person(ID)
);

Он генерирует следующую модель Entity Framework:

alt text

Здесь я пытаюсь создать makeпростое приложение, чтобы я мог научиться использовать SQLite, чтобы я мог сохранить нового человека в базе данных, а также сохранить новый отдел.У отдела может быть только 1 руководитель, и человек может быть руководителем многих отделов.

Прямо сейчас я сосредоточен на создании нового отдела.

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

namespace SQLite_Testing_Grounds
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            LoadUsersToComboBox();
        }

        private void LoadUsersToComboBox()
        {
            throw new NotImplementedException();
        }

        private void button2_Click(object sender, EventArgs e)
        {            
            CreateNewPerson();
        }

        private void CreateNewPerson()
        {
            if (textBox2.Text != String.Empty)
            {
                ScansEntities1 db = new ScansEntities1();
                Person user = new Person()
                {
                    Name = textBox1.Text
                };

                db.AddToPeople(user);
                db.SaveChanges();
            }            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CreateNewDepartment();
        }

        private void CreateNewDepartment()
        {
            if ((textBox1.Text != String.Empty) && (comboBox1.SelectedIndex >= 0))
            {
                ScansEntities1 db = new ScansEntities1();                            
                Department department = new Department()
                {
                    Name = textBox1.Text,
                    //Then what goes here? :/

                };
            }
            throw new NotImplementedException();
        }
    }
}

Как сохранить идентификатор выбранного «Человека» с помощью ComboBox?

alt text

РЕДАКТИРОВАТЬ!

Следуя совету Джона Х., мой класс Отдела (созданный EF) не содержит определения Лидера (как я и ожидал, еслиЯ использовал MS SQL).

Вот скриншот того, что имеет .Еще раз спасибо за огромную помощь.alt text

1 Ответ

3 голосов
/ 28 октября 2010

Вам нужно оцепить человека и прикрепить его к контексту, используйте этого человека в качестве ориентира для ЛИДЕРА в вашем объекте отдела.

Справочник объектов-заглушек http://blogs.msdn.com/b/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

    private void CreateNewDepartment()
    {
        if ((textBox1.Text != String.Empty) && (comboBox1.SelectedIndex >= 0))
        {
            ScansEntities1 db = new ScansEntities1();
            Person person = new Person() {Id = /*SomeId*/};
            db.AttachTo("Person", person);
            Department department = new Department()
            {
                Name = textBox1.Text,
                Person = person

            };
            db.AddToDepartment(department);
            db.SaveChanges();

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...