EF模型将一对一关系变为多对多关系

EF model change one-to-one relationship to many-to-many relationship

我有两个具有 one-to-one 关系的表。

    public class Name
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Category
    {
        public int Id { get; set; }
        public string Category { get; set; }
        public int? NameId { get; set; }

       [ForeignKey("NameId ")]
       public virtual Name Name { get; set; }
    }

我已经在那些表中有数据了。
我知道不支持更改数据库关系。
是否可以将 one-to-one 关系更改为 many-to-many 关系?
克服此要求的最合适方法是什么?

是的,您仍然可以使用迁移来更改它。

第 1 步 是创建一个链接 table,如 NameCategories,看起来像这样:

public class NameCategories
{
    public int Id { get; set; }
    
    public int NameId { get; set; }
    public Name Name { get; set; }
    
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

第 2 步 是在您已有的 table 中引用此 table。在 Name 中看起来像这样

 public class Name
 {
    public int Id { get; set; }
    public string Name { get; set; }
    
    public virtual ICollection<NameCategory> Categories { get; set; }
 }

第3步是加一个migration。您将有一些 AddColumn() 和一些 DropColumn() 语句。在它们之间,当所有的 add 东西都被执行但 drops 还没有执行时,你可以添加 SQL 代码来将所有现有的关系转移到新创建的 table 中。之后,旧数据将被DropColumn()代码删除。在您的示例中,这看起来像这样

INSERT INTO NameCategories (NameId, CategoryId)
SELECT (n.Id, c.Id) FROM Names n
JOIN Categories c on c.NameId = n.Id
WHERE ..

您可以像这样在迁移中执行 SQL:

var sql = @"...";
Sql(sql);

希望对您有所帮助!