C # - Linq много ко многим с соединительной таблицей - PullRequest
2 голосов
/ 05 мая 2011

Я только начал использовать Linq, и в данный момент у меня есть готовая база данных и я создал несколько классов сущностей в C #.

Теперь мой объект под названием «Персона» имеет отношение «многие ко многим» с «Профессией». Но всякий раз, когда я пытаюсь вызвать следующее утверждение, оно не будет работать:

Context ctx = new Context(ConfigurationManager.ConnectionStrings["myContext"].ConnectionString);
var Julian = (from j in ctx.persons
                         where j.Name == "Julian"
                         select j).Single();
Profession proftest = new Profession() { Name = "Programmer", Accepted = true };
Julian.Professesions.Add(proftest);
ctx.SubmitChanges();

Теперь я покажу вам классы, с которыми я работаю:

Человек получил следующие несколько вещей (остальная часть переменной класса работает, поэтому я покажу вам плохую часть):

// Data (for mapping)
private EntitySet<PersonProfession> personProfession;

public Person()
        {
            personProfession = new EntitySet<PersonProfession>();
        }


        [Association(Name = "FK_j_Person_Profession_Person", Storage = "personProfession", OtherKey = "personId", ThisKey = "Id")]
        internal ICollection<PersonProfession> PersonProfessions
        {
            get { return personProfession; }
            set { personProfession.Assign(value); }
        }
public ICollection<Profession> Professions
        {
            get { return (from prof in PersonProfessions where prof.Profession.Accepted==true select prof.Profession).ToList(); }
        }

Теперь я могу успешно вызвать следующий метод в классе "Person":

public void AddProfession(Profession profession, Person person)
        {
            PersonProfession pp = new PersonProfession();
            pp.Person = person;
            pp.Profession = profession;
            personProfession.Add(pp);
        }

Но, конечно, это не то, что я хочу.

Соотношение данных выглядит следующим образом:

Персона -> j_Person_Profession <- Профессия </p>

У меня также есть та же проблема (что .Add () не работает) с другим отношением между Person и Alias ​​(это таблица с только int для PersonId и String для псевдонима.


Последний маленький вопрос: Мой класс «Профессия» также получил ту же связь с «Человеком», поэтому, когда я спрашиваю контекст для человека, я могу посмотреть на его / ее профессию, и в рамках этой профессии больше людей с такой же профессией. Разве это не очень медленно с большими базами данных? Может мне удалить обратную ссылку?

1 Ответ

2 голосов
/ 18 мая 2011

Из комментария Якимича , я получил ответ:

вы используете Linq-to-SQL, не так ли? AFAIK, L2S отображает соединительную таблицу как сущность, поэтому вы должны использовать объект PersonProfession, как в рабочем примере. В случае Entity Framework, в отличие от L2S, чистая соединительная таблица (содержащая только два внешних ключа) не будет отображена в отдельную сущность, и вы сможете получить прямой доступ к Person.Professions и Professions.People.

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