我有以下问题:
我有2个类,我不想先用代码来生成数据库。
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属性指向它的初始状态。
但无论我尝试什么,我都不会让它发挥作用。我已经使用了数据注释,流畅的api和foreignkey属性,但仍然遇到如下问题:
“无法确定依赖操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。”
为了使这更加有趣,我还希望初始状态是图表类的状态之一。
有人可以帮帮我吗?
更新:
我找到了一块拼图:
代码第一个框架尝试创建2个表
图表:列 - &gt; Id,Initial_Id
州:有栏目 - &gt; Id,Name,Chart_Id
Chart.Initial_Id引用States表和State.Chart_Id引用Charts表。现在,这在级联删除或插入等时引入了循环问题...
嗯...
答案 0 :(得分:0)
这只是一个黑暗的镜头,但你认为这与两个类的属性(可能是你想要的主键)有一个名为id的guid这一事实有关吗?将它重命名为StateId和ChartId怎么样?如果不出意外,我认为这只是更好的命名实践......
完全披露:我不使用CF EF,但只是偶然发现这是一篇有趣的帖子
答案 1 :(得分:0)
EF当前无法完全按照您的编写方式执行此映射,因为它最终会出现循环依赖关系和数据库生成的密钥的组合,无法确定更新/插入顺序。
但是,在这些行之间进行读取,我将假设可能在多个图表实体之间共享状态实体。换句话说,多个图表可以指向同一个州。在这种情况下,你真正拥有的是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实体相关联,那么你需要找出其他的东西 - 可能有解决方法使这个工作,但不像上面的解决方案那么容易。