【发布时间】:2011-08-14 13:02:13
【问题描述】:
我正在尝试将标记系统添加到基于 MVC3 构建的 Web 应用程序中,使用 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();
}
我找到了解决方案,问题是项目没有正确更新并且值从未保存。
【问题讨论】:
-
GetTagByID 函数代码是什么样的?
-
公共标签 GetTagByID(int tagId) { return db.Tags.Where(t => t.TagID == tagId).First(); }
-
一些额外的信息。标签在插入时正确创建,但已创建 bij Code First 的可连接件未填充。任何想法为什么?当我手动播种此表时,项目会显示正确的标签。我必须自己设置可连接的值吗?
标签: c# .net asp.net-mvc-3 ef-code-first