【问题标题】:Entity Framework Code First Migration issue with linking tables带有链接表的实体框架代码优先迁移问题
【发布时间】:2013-04-18 01:53:14
【问题描述】:

我首先使用的是 EF 5.0 代码,通过 PM 控制台使用自动迁移。

我正在尝试将第 4 次迁移应用到项目中,并且基于约定的链接表命名导致它们被删除并使用不同的名称重新创建。在之前的任何迁移中都没有发生这种情况。

例子:

我有 2 个类 User 和 Site。

初始创建迁移

按照惯例,这创建了一个名为“UserSites”的链接表。

CreateTable(
           "dbo.UserSites",
            c => new
                {
                    User_Id = c.Guid(nullable: false),
                    Site_Id = c.Guid(nullable: false),
                })
            .PrimaryKey(t => new { t.User_Id, t.Site_Id })
            .ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true)
            .ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true)
            .Index(t => t.User_Id)
            .Index(t => t.Site_Id);

一切正常。

跳到今天:

第四次迁移

这会删除 UserSites 链接表并创建一个 SiteUsers 链接表。

显然不理想!

public override void Up()
    {
        DropForeignKey("dbo.UserSites", "User_Id", "dbo.Users");
        DropForeignKey("dbo.UserSites", "Site_Id", "dbo.Sites");
        DropIndex("dbo.UserSites", new[] { "User_Id" });
        DropIndex("dbo.UserSites", new[] { "Site_Id" });


        CreateTable(
            "dbo.SiteUsers",
            c => new
                {
                    Site_Id = c.Guid(nullable: false),
                    User_Id = c.Guid(nullable: false),
                })
            .PrimaryKey(t => new { t.Site_Id, t.User_Id })
            .ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true)
            .ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true)
            .Index(t => t.Site_Id)
            .Index(t => t.User_Id);

        DropTable("dbo.UserSites");

我无法解释这一点。

自第一次实现以来,这两个类都没有改变......我想如果我应用它,我会遭受数据丢失。

所以问题:

  1. 我可以从迁移脚本中删除此代码并继续使用我现有的结构吗?

  2. 是否有我不知道的问题可能导致此问题?

非常感谢任何/所有帮助!

编辑:

我只是简单地定义了如下的类,并允许按照惯例构建模型。我已经更改了 dbcontext 的命名空间,但仅此而已!让我迷惑不解。

public class User
{
   public virtual ICollection<Site> Sites { get; set; }
}

public class Site
{
    public virtual ICollection<User> Users { get; set; }
}

【问题讨论】:

    标签: c# entity-framework .net-4.5 entity-framework-migrations


    【解决方案1】:

    这是一个奇怪的情况。您是否更改了 DbContext 中的任何内容?如何在类中声明 SitesUsers 属性?

    我认为您应该显式地将多对多关系添加到您的数据库上下文中,如下所示:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<User>()
                    .HasMany<Sites>(u => u.Sites)
                    .WithMany(e => e.Users)
                    .Map(
                        m =>
                            {
                                m.MapLeftKey("User_Id");
                                m.MapRightKey("Site_Id");
                                m.ToTable("UserSites");
                            });
    
        //for prevent error 'The referential relationship will result in a cyclical reference that is not allowed'
        modelBuilder.Entity<Sites>()
                    .HasRequired(s => s.User)
                    .WithMany()
                    .WillCascadeOnDelete(false);
    }
    

    然后删除您的第 4 次迁移并尝试再次添加它

    如果您删除迁移代码,您会发现导航错误,例如外键问题、不正确的表名等。

    【讨论】:

    • 我已编辑问题以显示模型定义。我怀疑你是对的,我最好明确定义这种关系。您认为我可以在这个开发阶段将上述内容添加到模型构建器中吗?我想我还是试试吧!
    • 好吧,我不知道为什么会发生这种情况,但我已经按照您的建议覆盖了基于多对多的约定(以便复制我最初自动创建的模式)和这已经解决了我遇到的 Drop-Create 混乱。
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多