c# – 实体框架代码与同一类的第一个双重关系
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 实体框架代码与同一类的第一个双重关系,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2945字,纯文字阅读大概需要5分钟。
内容图文
我有一个与类似页面关联的Page类.每个关联都有关于该关联的其他信息.这是已定义为Page表示的类.
public class Page {
[Key]
public virtual int Id { get; protected set; }
[Required]
[StringLength(32)]
public virtual string Name { get; set; }
[InverseProperty("Page")]
public virtual ICollection<Association> Associations { get; set; }
}
每个页面都可以与任意数量的其他页面相关联.这将被定义为源页面和目标页面.我不介意关联是单向还是双向,在我的特定情况下要么合理(我更喜欢双向关联,很难).这是关联类..
public class Association {
[Key, Column(Order = 0)]
public virtual int PageId { get; protected set; } // SOURCE
[Required]
public virtual Page Page { get; set; } // SOURCE
[Key, Column(Order = 1)]
public virtual int TargetId { get; protected set; } // TARGET
[Required]
public virtual Page Target { get; set; } // TARGET
[Required]
[StringLength(32)]
public virtual string InformationAboutTheAssociation { get; set; }
}
现在我有以下背景……
public class DbCtx : DbContext {
public DbSet<Association> Associations { get; set; }
public DbSet<Page> Pages { get; set; }
}
问题是SQL Express抱怨可能的循环引用(事实并非如此,但它过于保护).如何解决为接受所描述的场景而生成的方案?
Introducing FOREIGN KEY constraint 'FK_dbo.Associations_dbo.Pages_TargetId' on table 'Associations' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
谢谢!
解决方法:
响应
做错误告诉你的事情.
指定ON DELETE NO ACTION或ON UPDATE NO ACTION.由于你有两个外键到同一个实体,并且模型首先(可能)默认插入删除级联,你必须禁用它,因为当一个页面被删除时,该关联将尝试被第一个外键删除,但是由于第二个外键而失败.
修改3
public class DbCtx : DbContext {
public DbSet<Association> Associations { get; set; }
public DbSet<Page> Pages { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Association>()
.HasRequired(x => x.Page)
.WithMany(x => x.Associations)
.WillCascadeOnDelete(false);
}
}
我认为这应该有效.
删除页面实体
因为如果您尝试删除页面,则在关联上没有删除级联,如果您具有依赖于要删除的页面实体的关联实体,则它将失败.
因此,当您要删除页面时,必须先删除引用该页面的所有关联.从Association到Page有一个外来约束(实际上有两个).仅使用其中一个并保持一致(Page或Target).
既然你已经问过这个问题,我只能得出结论,你真的不知道SQL是如何工作的,所以如果你还读了一本关于设计数据库和使用SQL的书,那就更好了.
我没有首先在EF中使用代码,但考虑到实体关系图,Page有“1对多”,关联和关联有两个“1对1”与页面.
这不是循环,因为它似乎是一个糟糕的设计.
规范化数据库.
如果你要设计数据库(数据库优先),你不需要页面和关联之间的关系“1到多”,因为你已经有了从关联到页面的关系“1到1”(其中两个).
因此,如果您想要查找知道pagId的特定关联,您可以选择select * from association其中pageId或targetId =您要查找的ID.
如果您首先使用EF与数据库,您将有一个从页面到关联的后向引用(您在此处尝试做什么),但不在数据库本身的实际实体关系模型中.它们是虚拟参考.
编辑:
我重读了这个问题,问题是从协会到页面的第二个引用.这很奇怪,因为数据库首先在这种情况下正常工作.
我会仔细看看的.
内容总结
以上是互联网集市为您收集整理的c# – 实体框架代码与同一类的第一个双重关系全部内容,希望文章能够帮你解决c# – 实体框架代码与同一类的第一个双重关系所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。