【问题标题】:EntityFramework Add to Many-To-ManyEntityFramework 添加到多对多
【发布时间】:2014-09-30 02:18:10
【问题描述】:

我有一个假期和一个国家列表。我希望使用多对多关系将这些绑定在一起。我有一个代码优先的假期模型和国家模型。单个表和连接表都已成功生成。

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

模型

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() 的调用。

【问题讨论】:

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


    【解决方案1】:

    有趣的问题在于您的示例代码看起来都很好。事实上,我围绕这段代码进行了快速测试,Entity Framework 按预期创建了映射表vacationscountries 并正确填充它。

    在即将发生的变化中,您能否确认您正在查看由 Entity Framework 创建的映射表,而不是自定义映射表?我提到它的唯一原因是(据我所知)无法使用数据注释将多对多关系映射到自定义联结表。

    如果不是这样,那么我接下来要做的就是追踪由 Entity Framework 生成的 sql - 使用您的本地数据库追踪工具(例如 Sql Profiler)、EFProf 等第三方工具,或者通过一个日志拦截器(http://msdn.microsoft.com/en-gb/data/dn469464.aspx)。希望这将为问题提供一些较低层次的见解。

    【讨论】:

    • 是的,我可以确认。我的countriesvacations 连接表是由 ef6 自动生成的。我追踪了正在生成的 SQL 并针对数据库运行。我确实看到了假期查询和国家/地区查询。但是,不存在创建关系或将某些内容插入连接表的查询。
    【解决方案2】:

    我重新创建了您的模型,但做了一些调整,产生了相同的结果。我使用以下代码手动创建了联结表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 表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多