gpt4 book ai didi

c# - Automapper Entity Framework 外键为空

转载 作者:行者123 更新时间:2023-11-30 16:55:50 33 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 更新数据库,我使用自动映射器将我的实体映射到 View 模型,然后以相同的方式将其映射回来:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([FromJson] MyCVViewModel model)
{
var userId = User.Identity.GetUserId();
//find the cv
CV cv = repository.FindCV(model.CVId);

//auto mapper mapping
Mapper.CreateMap<MyCVViewModel, CV>();
Mapper.CreateMap<MyCompanyViewModel, Company>();
cv = Mapper.Map<MyCVViewModel, CV>(model, cv);

//edit
repository.EditCV(cv);
}

当我映射回去的时候,company实体里面的外键CVid变成了0,我觉得映射过程中丢失了一些东西,你怎么映射外键?

enter image description here

这是我的 View 模型和实体:

查看模型:

public class MyCVViewModel
{
public int CVId { get; set; }

[Required]
[StringLength(100, ErrorMessage = "Title cannot exceed 100 characters.")]
[Display(Name = "Title")]
public string Title { get; set; }
[Required]
[StringLength(1000, ErrorMessage = "Statment cannot exceed 1000 characters.")]
[Display(Name = "Statement")]
public string Statement { get; set; }

public bool Reference { get; set; }

public List<MyCompanyViewModel> Companies { get; set; }
}

public class MyCompanyViewModel
{
[Required]
[StringLength(100, ErrorMessage = "Company Name cannot exceed 100 characters.")]
[Display(Name = "Company Name")]
public string CompanyName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "Job Title cannot exceed 100 characters.")]
[Display(Name = "Job Title")]
public string JobTitle { get; set; }
[Required]
[DataType(DataType.Date)]
[Display(Name = "Start Date")]
public DateTime StartDate { get; set; }
[Required]
[DataType(DataType.Date)]
[Display(Name = "End Date")]
public DateTime EndDate { get; set; }
[Required]
[StringLength(1000, ErrorMessage = "Job Description cannot exceed 1000 characters.")]
[Display(Name = "Job Description")]
public string Description { get; set; }
}

实体:

public class CV
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CVId { get; set; }
public string Title { get; set; }
public string Statement { get; set; }
public bool Reference { get; set; }

public virtual ICollection<Company> Companies { get; set; }
}

public class Company
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CompanyId { get; set; }

public string CompanyName { get; set; }
public string JobTitle { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public string Description { get; set; }

public virtual CV CV { get; set; }
public int CVId { get; set; }
}

这是我尝试更新时的错误消息:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。

我知道问题出在哪里,但不知道如何告诉 automapper 保留外键值

最佳答案

MyCompanyViewModel 类不包含 CVId 属性的定义,因此默认情况下 Automapper 不知道他应该在哪里取值进行注入(inject)进入 CompanyCVId 属性。只需定义它:

public class MyCompanyViewModel
{
public int CVId { get; set; }
// Other properties
}

然后为每个 CompanyViewModel 添加相应的隐藏输入字段到 View 中:

@for (int i = 0; i < Model.Companies.Count; i++)
{

// ...

@Html.HiddenFor(m => Model.Companies[i].CVId)

// ...

}

一切顺利!

关于c# - Automapper Entity Framework 外键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28955542/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com