我正在尝试使用EF Code First为MVC3上的web应用程序构建添加标记系统以进行数据访问。基地非常简单。我有项目,公司和可以拥有一个或多个标签的人。我不想单独为每个实体保存标签,因此标签类有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();
}
我找到了解决方案,问题是项目没有正确更新,价值从未保存过。
答案 0 :(得分:0)
您是否确定您的数据库没有EF 4.1生成的任何奇怪命名的列?我曾经发生过一次,而FK列被称为UserTrialLicense_UserTrialLicenseID。因此,每当我尝试使用.Include来加载任何内容时,它都无法正常工作。