我有假期和国家列表。我想用多对多的关系把它们捆绑在一起。我有一个代码优先的假期模型和国家模型。单个表以及连接表都已成功生成。
但是,当我尝试将某个国家/地区添加到某个假期时(反之亦然),该联接表仍为空。我能够成功地添加个人假期以及各国。
模型
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()
的调用。
答案 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表中。