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);
希望对您有所帮助!
我有两个具有 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);
希望对您有所帮助!