我创建了一个MVC项目,我在其中设置了业务层和数据层。 我在数据层中使用EntityFramework,并希望不在数据层之外使用我的DAL对象。 (首先,这是一个好主意吗?)
我选择使用AutoMapper,并认为我会为我的Entity Framework对象创建DTO。 这些将通过我的业务层传递到我的前端,由用户在表单中进行编辑,然后通过业务层保存回数据层。
我认为这个似乎就像一个好主意,并开始试验它。
我认为我的DTO需要保留他们的主键ID,但我可以放弃我的ForeignKey ID属性(使用Column属性),因为我不应该在其他层中使用它们。 (我觉得在我的DTO中暴露它们会给它一个机会被误操作)
public class Player
{
[Key]
public int PlayerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Column("ClubId")]
public int? CurrentClubId { get; set; }
[ForeignKey("CurrentClubId")]
public virtual Club CurrentClub { get; set; }
}
public class PlayerDTO
{
public int PlayerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// notice CurrentClubId property doesn't exist in DTO
public virtual Club CurrentClub { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public string Name { get; set; }
}
public class ClubDTO
{
public int ClubId { get; set; }
public string Name { get; set; }
}
现在我发现,在编辑PlayerDTO的表单的视图中,我需要填写所有可用俱乐部的下拉列表。
<div class="editor-label">
@Html.LabelFor(model => model.PlayerObject.CurrentClub.ClubId, "Current Club")
</div>
<div class="editor-field">
@Html.DropDownListFor(m => m.PlayerObject.CurrentClub.ClubId, Model.Clubs)
@Html.ValidationMessageFor(model => model.PlayerObject.CurrentClub.ClubId)
</div>
注意:model是一个PlayerEditViewModel,包含一个PlayerDTO属性,'PlayerObject'。
这将返回俱乐部ID。但关于俱乐部的其他一切都是未知数。 那么我调用save,然后回到我设置的数据层
Player PlayerObj = AutoMapper.Mapper.Map<Player>(PlayerDTOObj);
PlayerObj.CurrentClubId = PlayerDTOObj.Club.ClubId;
这看起来有点笨拙,我设想这个滚雪球。如果俱乐部有比赛属性,并且每个比赛都有一个赛季....突然我不得不担心我的数据层的更新方法中的每个ForeignKey。
为了避免这种情况,我应该坚持映射我的ForeignKey ID吗? 或者我可以继续这样做,但只为每个ForeignKey Id生成自定义属性映射? 我觉得我不需要它们,直到我最终在这种情况下尝试写回数据库。