EF - Code First: проблема сохранения значений в отношениях «многие ко многим» - PullRequest
1 голос
/ 14 августа 2011

Я пытаюсь добавить систему тегов в сборку веб-приложения на MVC3 с EF Code First для доступа к данным. База довольно проста. У меня есть проекты, компании и люди, которые могут иметь 1 или более тегов. Я не хочу сохранять теги для каждого объекта в отдельности, поэтому у класса тегов есть 3 ICollections: люди, компании и проекты. Каждый из объектов имеет ICollection тега. см. код ниже

public class Project 
{
    public int ID { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Person
{
    public int ID { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Company
{
    public int ID { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    [Key]
    public int TagID { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<Person> People { get; set; }
    public virtual ICollection<Company> Companies { get; set; }
}

В контексте отображение устанавливается так:

modelBuilder.Entity<Tag>()
    .HasMany(t => t.Projects)
    .WithMany(p => p.Tags)
    .Map(m =>
    {
        m.MapLeftKey("ID");
        m.MapRightKey("TagID");
        m.ToTable("TagProjects");
    });


modelBuilder.Entity<Tag>()
    .HasMany(t => t.People)
    .WithMany(p => p.Tags)
    .Map(m => 
    {
        m.MapLeftKey("ID");
        m.MapRightKey("TagID");
        m.ToTable("TagPeople");
    });

modelBuilder.Entity<Tag>()
    .HasMany(t => t.Companies)
    .WithMany(p => p.Tags)
    .Map(m =>
    {
        m.MapLeftKey("ID");
        m.MapRightKey("TagID");
        m.ToTable("TagCompanies");
    });

Теперь, когда я пытаюсь добавить тег в проект, подобный этому:

public void AddTagToProject(int tagId, int projectId)
{
    ProjectRepository projectRepository = new ProjectRepository();
    Project project = projectRepository.GetProjectByID(projectId);
    project.Tags.Add(GetTagByID(tagId));

    Save();
}

Нет исключения, но к проекту также не добавлены теги. У кого-нибудь есть идеи, где искать?

public Tag GetTagByID(int tagId) 
{ 
    return db.Tags
        .Where(t => t.TagID == tagId)
        .First(); 
}

Я нашел решение, проблема была в том, что проект не был корректно обновлен, а значения никогда не сохранялись.

1 Ответ

0 голосов
/ 15 августа 2011

Вы убедились, что в вашей базе данных нет столбцов со странными именами, созданных EF 4.1? У меня такое было однажды, и столбец FK назывался UserTrialLicense_UserTrialLicenseID. Поэтому всякий раз, когда я пытался загрузить что-либо с помощью .Include, это не сработало бы.

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