Я пытаюсь добавить систему тегов в сборку веб-приложения на 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();
}
Я нашел решение, проблема была в том, что проект не был корректно обновлен, а значения никогда не сохранялись.