EF - 代码优先:在多对多关系中保存值的问题

时间:2011-08-14 13:02:13

标签: c# .net asp.net-mvc-3 ef-code-first

我正在尝试使用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(); 
}

我找到了解决方案,问题是项目没有正确更新,价值从未保存过。

1 个答案:

答案 0 :(得分:0)

您是否确定您的数据库没有EF 4.1生成的任何奇怪命名的列?我曾经发生过一次,而FK列被称为UserTrialLicense_UserTrialLicenseID。因此,每当我尝试使用.Include来加载任何内容时,它都无法正常工作。

相关问题