EntityFramework添加到多对多

时间:2014-08-07 00:20:52

标签: c# asp.net entity-framework ef-code-first many-to-many

我有假期和国家列表。我想用多对多的关系把它们捆绑在一起。我有一个代码优先的假期模型和国家模型。单个表以及连接表都已成功生成。

但是,当我尝试将某个国家/地区添加到某个假期时(反之亦然),该联接表仍为空。我能够成功地添加个人假期以及各国。

模型

public class Vacations
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int VacationId { get; set; }

    public string ProductId { get; set; }

    public string Name { get; set; }

    public string Price { get; set; }

    public virtual ICollection<Countries> Countries { get; set; }


    public Vacations()
    {
        Countries = new List<Countries>();
    }
}



public class Countries
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CountryID { get; set; }
    public string CountryName { get; set; }

    public virtual ICollection<Vacations> Vacations { get; set; }
    public Countries()
    {
        Vacations = new List<Vacations>();
    }
}




public class MyContext : DbContext
{
    public MyContext()
        : base("myconn")
    {
    }

    public DbSet<Vacations> Vacations { get; set; }

    public DbSet<Countries> Countries { get; set; }
}

插入假期

            Vacations vacation = database.Vacations.Add(new Vacations
            {
                Name = vacationData.Name,
                Description = vacationData.Description,
            });

            database.SaveChanges();            
            // to make sure the key is in the database to refrence

            foreach (string country in AllMyCountries)
            {
                Countries countries = database.Countries.Add(new Countries
                {
                    CountryName = country
                });
                countries.Vacations.Add(vacation);
                vacation.Countries.Add(countries);
            }

            database.SaveChanges();

我还试过添加到一个实体,并在中间添加更多对SaveChanges()的调用。

2 个答案:

答案 0 :(得分:0)

有趣的问题是你的示例代码看起来都很好。事实上,我对这段代码进行了快速测试,实体框架按预期创建了映射表vacationscountries并正确填充。

即时更改,您能否确认您正在查看Entity Framework创建的映射表而不是自定义映射表?我提到它的唯一原因是没有办法(我知道)使用数据注释将多对多关系映射到自定义联结表。

如果不是这样,那么接下来我要做的就是追踪实体框架生成的sql - 使用本机数据库跟踪工具(例如Sql Profiler),像EFProf这样的第三方工具,或者通过日志拦截器(http://msdn.microsoft.com/en-gb/data/dn469464.aspx)。希望这会对问题提供一些较低级别的见解。

答案 1 :(得分:0)

我重新创建了你的模型,但做了一些调整,产生了相同的结果。我使用以下代码手动创建了联结表VacationsCountries

public class VacationsCountries
{
    [Key, Column(Order = 0)]
    public int VacationId { get; set; }
    public virtual Vacations Vacation { get; set; }
    [Key, Column(Order = 1)]
    public int CountryId { get; set; }
    public virtual Countries Country { get; set; }
}

我还在MyContext类中添加了这行代码:

public DbSet<VacationsCountries> VacationsCountries { get; set; }

而不是使用:

countries.Vacations.Add(vacation);
vacation.Countries.Add(countries);

我用:

VacationsCountries vc = database.VacationsCountries.Add(new VacationsCountries
{
    Country = countries,
    Vacation = vacation
});

然后拨打database.SaveChanges();

我检查了数据库,并将条目添加到VacationsCountries表中。