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

本文关键字:关系 保存 问题 EF 代码 | 更新日期: 2023-09-27 18:05:38

我正试图添加一个标签系统,以建立在MVC3上的web应用程序与EF代码首先进行数据访问。基础很简单。我有项目,公司和人谁可以有1个或更多的标签。我不想单独为每个实体保存标记,因此标记类有3个集合:People、Companies和Projects。每个实体都有一个标记集合。参见下面的代码

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(); 
}

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

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

您是否确定您的数据库中没有任何由EF 4.1生成的命名奇怪的列?我让它发生过一次,FK列叫做UserTrialLicense_UserTrialLicenseID。因此,每当我尝试使用。include加载任何内容时,它都不会工作。