我在 EF6 和 AspNetCore 中使用代码优先,使用脚手架模板创建数百个表和视图。
在简单的导航模型中
public class BaseModel
{
public int Id { get; set; }
[MaxLength(100)]
[Column(TypeName = "varchar(100)")]
public string? BaseModelNo { get; set; }
public virtual ICollection<SubModel>? SubModels { get; set; }
}
public class SubModel
{
public int Id { get; set; }
[MaxLength(100)]
[Column(TypeName = "varchar(100)")]
public string? SubModelNo { get; set; }
public int BaseModelId { get; set; }
public virtual BaseModel? BaseModelNo { get; set; }
}
搭建脚手架时,控制器:
...
ViewData["BaseModelId"] = new SelectList(_context.BaseModels, "Id", "Id", model.BaseModelId);
return View();
...
和详细视图
...
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.BaseModel.Id)
</dd>
...
我的问题是 有没有办法让它自动绑定到第一个不是主键的属性
Id
,在这个例子中应该是BaseModelNo
所以在控制器中:
...
ViewData["BaseModelId"] = new SelectList(_context.BaseModels, "Id", "BaseModelNo", model.BaseModelId);
return View();
...
和详细视图
...
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.BaseModel.BaseModelNo)
</dd>
...
我试过的:改变模型的顺序
对于遇到此问题或发现它有趣的任何人,我发布了源代码 在here
的gihub上我仍然希望有人解释为什么它以这种方式工作,但就目前而言,它可以工作,只需将模型放在一个单独的项目中即可。
在我的示例中,Models.cs 脚手架中的实体绑定到 Id,而 OtherModels.cs 脚手架中的实体绑定到第一个不可为 null 的字符串属性。
public class OtherBase
{
public int Id { get; set; }
public string? Name1 { get; set; }
public string Name2 { get; set; }
public virtual ICollection<OtherSub> OtherSub { get; set; }
}
所以在这种情况下将绑定到 Name2.