实体框架AutoMapper到DTO,我需要ForeignKey ID属性吗?

时间:2014-07-08 05:03:15

标签: .net asp.net-mvc entity-framework automapper

我创建了一个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生成自定义属性映射? 我觉得我不需要它们,直到我最终在这种情况下尝试写回数据库。

0 个答案:

没有答案