c# – 实体框架核心 – 不需要的删除级联
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 实体框架核心 – 不需要的删除级联,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2679字,纯文字阅读大概需要4分钟。
内容图文
![c# – 实体框架核心 – 不需要的删除级联](/upload/InfoBanner/zyjiaocheng/820/13a76ffa50bd415ba9115b45e3b23583.jpg)
我有实体框架核心,它执行我不想要的额外删除.
模型定义:我有两个实体Template和TemplateVersion. TemplateVersion只是模板的下一个版本,因此TemplateVersion有一个模板(N:1关系)
public class Template
{
public int Id { get; set; }
}
public class TemplateVersion
{
public int Id { get; set; }
public Template Template { get;set; }
}
到目前为止,一切都清楚是一种有益的工作.
但是:我想获得模板级别的信息,这是TemplateVersion的当前版本,所以我的模板定义现在看起来像(TemplateVersion和以前一样)
public class Template
{
public int Id { get; set; }
public TemplateVersion CurrentVersion { get; set;}
}
所以我想要的是TemplateVersion的N个实例指向1个模板实例,但同时Template指向1个TemplateVersion
这里的魔术开始了:当我添加一个模板和一个TemplateVersion时,一切都运行良好.
Template ---- TemplateVersionPrevious.Template == Template
但是,当我添加指向同一模板的另一个TemplateVersion实例(并更新模板的CurrentVersion)时,TemplateVersion的第一个实例突然将其Template字段置为空.
Template ---- TemplateVersionPrevious.Template == null
---- TemplateVersionCurrent.Template == Template
我相信这是因为实体框架认为我有一个经典的1:1关系,并且只有一个TemplateVersion实例可以与同一个模板有关系 – 而且这是因为CurrentTemplate字段.
如何告诉Entity Framework它不应该清除我的TemplateVersion关系?
附加信息:一旦我定义了我的TemplateVersion实体,如下所示
public class TemplateVersion
{
public int Id { get; set; }
[ForeignKey(nameof(TemplateId))]
public Template Template { get;set; }
public int TemplateId {get;set;}
}
它变得更有趣:之前的TemplateVersion实例刚被删除!
Template ---- TemplateVersionCurrent.Template == Template
解决方法:
EF默认约定不适用于2个实体之间的多个关系.并且数据注释不能很好地与一对一关系或单向关联(在一端没有导航属性的关系).
您需要使用流畅的API显式配置所需的关系.由于流畅的API对于具有/不具有导航属性具有不同的重载并且用于纠正过载很重要,所以假设您的模型与此完全相同(我的意思是导航和显式FK属性影响关系,其他属性无关紧要):
public class Template
{
public int Id { get; set; }
public TemplateVersion CurrentVersion { get; set; }
}
public class TemplateVersion
{
public int Id { get; set; }
public Template Template { get; set; }
}
所需两种关系的流畅配置如下:
modelBuilder.Entity<Template>()
.HasMany<TemplateVersion>()
.WithOne(e => e.Template)
.IsRequired();
modelBuilder.Entity<Template>()
.HasOne(e => e.CurrentVersion)
.WithOne()
.HasForeignKey<Template>("TemplateVersionId")
.IsRequired(false);
请注意,您已定义了循环关系,因此其中一个应该是可选的.我选择了Template..TemplateVersionId作为我认为合乎逻辑的选择.
另请注意,对于一对一关系,主要和从属端不能从HasOne / WithOne唯一确定,因此您需要使用HasForeignKey和HasPrinciplaKey泛型类型参数来指定(相反,一对多关系具有没有这样的问题,因为一方总是主要的,而manu方面是依赖的).
有关详细信息,请参阅Relationships.
内容总结
以上是互联网集市为您收集整理的c# – 实体框架核心 – 不需要的删除级联全部内容,希望文章能够帮你解决c# – 实体框架核心 – 不需要的删除级联所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。