如何解决EF 模型将一对一关系改为多对多关系
我有两个具有 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 步是创建一个链接表,如 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 步是在您已有的表格中引用此表格。在 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()
语句。在它们之间,当所有添加的东西都已执行但尚未删除时,您可以添加 SQL 代码以将所有现有关系转移到新创建的表中。之后,旧数据将被 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);
希望能帮到你!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。