【发布时间】:2022-01-08 10:08:49
【问题描述】:
我在 C#/Blazor 中工作
我有一个对象,比如Project,我从带有外键及其相关导航属性的数据库中获取该对象。我正在获取对象,然后在断开连接状态下使用它。
一旦对象被提取,它就会被输入到一个表单中,以便根据需要显示/编辑/更新。我想创建一个单独的 Project 克隆,以在表单中用作 DTO,以便可以丢弃任何更改,而不会对原始获取的 Project 产生引用问题。
例如,这是一个简化的Project 类:
public partial class Project
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(150)]
public string ProjectName { get; set; }
[Column("UpdatedBy_Fk")]
public int UpdatedByFk { get; set; }
[ForeignKey(nameof(UpdatedByFk))]
[InverseProperty(nameof(UserData.ProjectUpdatedByFkNavigations))]
public virtual UserData UpdatedByFkNavigation { get; set; }
}
在表单中,我使用@project.UpdatedByFkNavigation.FullName 显示最后一个更新Project 的人的全名。用户根本无法修改导航字段,它只是显示。
我的问题是关于复制导航项。现在为简单起见,在表单的OnInitialized 中,我将原始project 对象传递给表单,并使用如下构造函数创建一个新的objProject:
Project objProject = new() { Id = project.Id,
ProjectName = project.ProjectName,
UpdatedByFk = project.UpdatedByFk,
UpdatedByFkNavigation = project.UpdatedByFkNavigation,
这似乎正在工作并创建一个单独的 Project 对象,它不是引用并且我可以用作我的 DTO,但是我不确定以这种方式分配 virtual 属性是否合适。
这种方法是否遵循创建具有虚拟导航字段的对象的非引用副本的最佳实践,还是我应该采用不同的方法?
【问题讨论】:
标签: c# entity-framework blazor blazor-server-side