我可以';t获得对同一类/表的2个引用
本文关键字:一类 引用 2个 表的 我可以 | 更新日期: 2023-09-27 18:27:02
我有以下问题:
我有两个类,我不想首先与代码一起使用它们来生成数据库。
public class Chart
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public State Initial { get; set; }
public virtual ICollection<State> States { get; set; }
}
和
public class State
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Name { get; set; }
}
我还希望Chart类的Initial属性指向它的初始State。
但无论我做什么,我都不会成功。我使用了数据注释、fluent api和foreignkey属性,但一直遇到以下问题:
无法确定依赖操作的有效顺序。依赖项可能是由于外键约束、模型要求或存储生成的值而存在的。
为了让这更有趣,我还希望初始状态是chart类的状态之一。
有人能帮帮我吗?
更新:
我发现了一块拼图:
代码优先框架尝试创建2个表
图表:带列->Id,Initial_Id
状态:带列->Id,Name,Chart_Id
Chart.Initial_Id引用States表,State.Chart_Id引用Charts表。现在介绍了级联删除或插入等时的循环问题…
嗯。。。
这只是一个未知数,但你认为这与两个类的属性(大概是你想要的主键)都有一个名为id的guid有关吗?将其重命名为StateId和ChartId怎么样?如果没有别的,我认为这只是更好的命名实践。。。
完整披露:我不使用CF EF,但只是偶然发现这是一个有趣的帖子
EF当前无法完全按照您编写的方式执行此映射,因为它最终包含循环依赖项和数据库生成的键,无法确定更新/插入顺序。
然而,从字里行间我会假设,也许国家实体应该在多个Chart实体之间共享。换句话说,多个图表可以引用同一个状态。在这种情况下,您真正拥有的是Chart和State之间的多对多关系,您可以覆盖OnModelCreating上下文来告诉EF这一点:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Chart>()
.HasMany(s => s.States)
.WithMany();
}
现在这样的东西会起作用:
using (var context = new ChartContext())
{
var state1 = new State { Name = "State1" };
var state2 = new State { Name = "State2" };
var chart =
new Chart
{
Initial = state1,
States = new List<State> { state1, state2 }
};
context.Charts.Add(chart);
context.SaveChanges();
}
正如您所看到的,Chart现在有一个初始状态和一个状态集合,初始状态是状态集合中的一个。
如果实际上每个State都与一个且唯一的Chart实体相关联,那么您需要找出其他方法——可能有一些变通方法可以实现这一点,但不如上面的解决方案那么容易。