- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在寻找一种在 EF Core 中编写“通用”更新方法的解决方案,该方法更新实体的所有已更改属性,包括相关集合。这样做的原因是我将实体名称的翻译存储在不同的表中。我找到了 this解决方案一开始似乎工作得很好,但后来我注意到当我在实体中唯一改变的是添加时,我收到错误“数据库操作预计会影响 1 行但实际上影响 0 行”相关表 TblProjectTranslations
中的新名称翻译。这是我的代码:
public async Task UpdateProjectAsync(TblProject updatedEntity)
{
TblProject dbEntity = Context.TblProjects
.Include(dbEntity => dbEntity.TblProjectTranslations)
.SingleOrDefault(dbEntity => dbEntity.ProjectId == updatedEntity.ProjectId);
if (dbEntity != null)
{
Context.Entry(dbEntity).CurrentValues.SetValues(updatedEntity);
foreach (TblProjectTranslation dbTranslation in dbEntity.TblProjectTranslations.ToList())
{
if (!updatedEntity.TblProjectTranslations
.Any(translation => translation.ProjectId == dbTranslation.ProjectId && translation.Language == dbTranslation.Language))
{
Context.TblProjectTranslations.Remove(dbTranslation);
}
}
foreach (TblProjectTranslation newTranslation in updatedEntity.TblProjectTranslations)
{
TblProjectTranslation dbTranslation = dbEntity.TblProjectTranslations
.SingleOrDefault(dbTranslation => dbTranslation.ProjectId == newTranslation.ProjectId && dbTranslation.Language == newTranslation.Language);
if (dbTranslation != null)
{
Context.Entry(dbTranslation).CurrentValues.SetValues(newTranslation);
}
else
{
dbEntity.TblProjectTranslations.Add(newTranslation);
}
}
await Context.SaveChangesAsync();
}
}
以下是反向工程的 EF Core 类:
public partial class TblProject
{
public TblProject()
{
TblProjectTranslations = new HashSet<TblProjectTranslation>();
}
public int ProjectId { get; set; }
public virtual ICollection<TblProjectTranslation> TblProjectTranslations { get; set; }
}
public partial class TblProjectTranslation
{
public int ProjectId { get; set; }
public string Language { get; set; }
public string ProjectName { get; set; }
public virtual TblProject Project { get; set; }
}
下面是它们在 OnModelCreating
中的定义方式:
modelBuilder.Entity<TblProject>(entity =>
{
entity.HasKey(e => e.ProjectId);
entity.ToTable("TBL_project");
entity.Property(e => e.ProjectId).HasColumnName("project_ID");
});
modelBuilder.Entity<TblProjectTranslation>(entity =>
{
entity.HasKey(e => new { e.ProjectId, e.Language });
entity.ToTable("TBL_project_translation");
entity.HasIndex(e => e.ProjectId, "IX_TBL_project_translation_project_ID");
entity.Property(e => e.ProjectId).HasColumnName("project_ID");
entity.Property(e => e.Language)
.HasMaxLength(5)
.HasColumnName("language")
.HasDefaultValueSql("('-')");
entity.Property(e => e.ProjectName)
.IsRequired()
.HasMaxLength(50)
.HasColumnName("project_name")
.HasDefaultValueSql("('-')");
entity.HasOne(d => d.Project)
.WithMany(p => p.TblProjectTranslations)
.HasForeignKey(d => d.ProjectId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("TBL_project_translation_TBL_project");
});
我不明白的是 dbEntity.TblProjectTranslations.Add(newTranslation)
似乎是问题所在。当我将此行替换为 await Context.TblProjectTranslations.AddAsync(newTranslation)
时,错误“神奇地”消失了,但这两种方式不应该做基本相同的事情吗?下面是一个 updatedEntity
和一个 dbEntity
的示例,我在问题发生之前调试函数时捕获了它们:
updatedEntity:
ProjectId: 41
TblProjectTranslations: 1 Entry with:
Language: "en"
Project: null
ProjectId: 41
ProjectName: "TestNameEN"
dbEntity:
ProjectId: 41
TblProjectTranslations: No entries
这是怎么回事?我什至在这两个表的数据库中都没有任何触发器,这似乎是其他一些人出现此错误的原因。
最佳答案
在试用了示例模型、代码和解释之后,我终于能够重现它。罪魁祸首似乎是复合键及其字符串部分的默认值:
entity.HasKey(e => new { e.ProjectId, e.Language }); // (1)
entity.Property(e => e.Language)
.HasMaxLength(5)
.HasColumnName("language")
.HasDefaultValueSql("('-')"); // (2)
如果你使用也会发生同样的情况
.HasDefaultValue("-")
这种组合以某种方式导致 EF 考虑添加到父集合导航属性的项目
dbEntity.TblProjectTranslations.Add(newTranslation);
作为 Modified
而不是 Added
,这后来导致问题中的错误。
因为我在 EF Core 文档中找不到这样的行为解释,而且通常它看起来是错误的,所以我建议去报告给 EF Core GitHub issue tracker .
同时,我看到的可能的解决方法是
删除键列的 .HasDefaultValueSql
/.HasDefaultValue
与其将子项添加到父集合,不如将其直接添加到上下文或相应的 DbSet
(可选地提前设置引用导航属性“以防万一”):
newTranslation.Project = dbEntity;
Context.Add(newTranslation);
关于c# - 添加相关实体时报错 "Database operation expected to affect 1 row(s) but actually affected 0 row(s)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70988764/
我一直在寻找一种在 EF Core 中编写“通用”更新方法的解决方案,该方法更新实体的所有已更改属性,包括相关集合。这样做的原因是我将实体名称的翻译存储在不同的表中。我找到了 this解决方案一开始似
我将 Identity Core 1.0 与 ASP.NET MVC Core 1.0 和 Entity Framework Core 1.0 结合使用来创建一个简单的用户注册系统 this arti
我必须创建一个悬停效果,其中当一个选项卡悬停时,该选项卡的整个背景应该是白色的。但正如下面 SS 中所见, , 悬停效果仅应用于文本部分。 我还附上了 Chrome Web 开发人员的 CSS。 生成
我正在研究一个 Prolog 问题,包括计算列表元素的数量: count([], 0). count([H|T], N) :- count(T, X), N is X+1, N
在下面的代码中,在 #content 规则中,overflow:hidden 做了一些魔术来自动调整 div 的 width。我尝试在 #content 中手动将宽度设置为某个值,例如 10000px
所以我有一些 CSS 生成这个。 HTML代码如下。 Home A
我喜欢使用 Visual Studio 中的“在 Microsoft Exel 中打开查询”按钮在 Excel 中管理父子 TFS 链接。我可以在 Excel 中创建两个工作项之间的父子关系,方法是剪
我目前正在尝试提高构建机器的性能。标准构建在每次提交 (svn) 后排队,大约需要 40 分钟。如果提交时已经有一个排队的构建,我们不会添加另一个。所以每个构建都有 1+ 次提交的更改。由于提交可能没
在列出的 php 文档中 here有迹象表明该函数使用读取、错误和写入数组值作为引用,但我无法在任何地方找到这些值中实际发生的变化。 我写了一个我现在使用的简单“服务器”,我注意到当提到的函数无法看到
嗨,我正在尝试定位第一个 .current-cat-parent 下的元素,但我的 jquery 代码正在影响所有 这下面的元素。我怎样才能只定位第一个立即元素?谢谢! $(".current-ca
我有一张表,我在 data_id 上有自动编号/序列 tabledata --------- data_id [PK] data_code [Unique] data_desc 示例代码: ins
我已经创建了 JFormattedTextField 的自定义组件 (NumberFormattedTextField)。这是我使用的格式化程序: public static Internat
据我了解,Apple 应用程序更新将安装一个新的独立应用程序,而不是对现有应用程序应用补丁。 有谁知道这个过程的更多细节吗?这适用于用户的所有目录吗?任何文件夹(如私有(private)文档)都不会受
我有一个允许我定义 alpha 背景的 sass mixin @mixin background-rgba($r,$g,$b,$a) { $color: ie_hex($r,$g,$b,$a)
我正在网络抓取如下表中的文本数据,我想获得结果: Lorem ipsum dolor sit amet consectetur adipiscing elit, sed do eiusmod temp
我正在学习事件委托(delegate),但遇到了问题。 一开始我做初稿的时候,如果点击只会删除文字,不会删除按钮,所以我修改了它。后来,当点击容器div时,它删除了整个内容,所以我再次更改它。 现在它
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) Align inline-block DIVs t
父元素没有溢出属性。父元素具有设置的高度。无论我尝试什么,导航栏都不会粘住。它也不适用于 JavaScript。我肯定错过了什么。下面是代码。有人请告诉我我做错了什么: /* Body */ body
问题 我的页脚中有四列,每列宽度为 25%。 对于平板电脑,宽度变为 50% - 每行两个。 但是,我无法对齐前两列和后两列。 这是一张显示它们当前外观的图片: 我试图让它们看起来像: |------
我正在尝试为网站构建菜单,我使用了以下代码: nav#menu:hover li{ background-color: #606060; } 但是,当我将鼠标悬停在网站上的列表项上时,代码会更
我是一名优秀的程序员,十分优秀!