【发布时间】:2015-06-20 15:47:29
【问题描述】:
[编辑] 在阅读之前,我已经设法通过简单地转换不同的数据类来解决这个问题。 我已经更新了代码,但欢迎大家提供提示!
尊敬的 stackoverflow 用户,
首先我想说的是,我知道这个问题很可能与 Automapper 相关。 不幸的是......由于某种原因,NuGet 不愿意安装 Automapper。 因此,我决定尝试在 DTO 和实体之间编写手动映射器。 我对 IoC 和 DI 有点陌生,我猜这是我的实现不正确的主要原因。
基本上我有 5+ 个不同的数据网格,它们都链接到不同的表,因此具有不同的结构。 但是,它们都具有完全相同的消息处理程序,这些消息处理程序指向视图模型中的相同方法,这些方法将负责添加、删除和修改。
处理删除的代码如下所示。
在视图模型中:
public void KeyDown(EventArgs eventArgs, object sourceSender)
{
var dataGridContext = sourceSender as DataGrid;
var keyEventArgs = eventArgs as KeyEventArgs;
if (keyEventArgs == null) return;
switch (keyEventArgs.Key)
{
case Key.Delete:
if (dataGridContext != null)
foreach (var selectedEntity in dataGridContext.SelectedItems.OfType<IEntityObject>())
{
_mainModel.DeletePendingEntityObject(selectedEntity);
}
break;
}
}
在模型中:
public void DeletePendingEntityObject<TEntity>(TEntity sender) where TEntity : IEntityObject
{
if (sender.State == EntityState.Added)
{
_pendingEntityObjects.Remove(sender);
return;
}
AddPendingEntityObject(sender, EntityState.Deleted);
}
处理添加和修改的代码如下所示:
在视图模型中:
public void RowEditEnding(object sender)
{
var dataGridContext = sender as DataGrid;
if (_isNewItem && dataGridContext != null)
{
var item = dataGridContext.CurrentItem as IEntityObject;
_mainModel.AddPendingEntityObject(item, EntityState.Added);
_isNewItem = false;
}
else if (dataGridContext != null)
{
var item = dataGridContext.CurrentItem as IEntityObject;
if (item == null) return;
_mainModel.AddPendingEntityObject(item, EntityState.Modified);
}
}
在模型中:
public void AddPendingEntityObject<TEntity>(TEntity sender,
EntityState entityState) where TEntity : IEntityObject
{
sender.State = entityState;
_pendingEntityObjects.Add(sender);
}
现在,所有这些都可以完美运行,直到我想创建一个映射器,将 DTO 对象映射到它们的实体,然后将其保存到数据库中。 我认为实现是不正确的,因为我必须在接口中添加我希望在 DtoMapper.cs 中可映射的每个属性(如下所示)。最终导致所有 DTO 的变量都与它们无关。
这是我的尝试:
foreach (var item in _pendingEntityObjects)
{
using (var context = new CentralEntities())
{
var entityObj = new DtoMapper<IEntityObject>(item);
context.Entry(entityObj.TranslatedObj).State = item.State;
context.SaveChanges();
}
}
这是 DtoMapper.cs 的样子:
public DtoMapper(T t)
{
if (t.GetType() == typeof(Table1Dto))
{
var table1Obj = t as Table1Dto;
if(table1Obj != null)
TranslatedObj = new table_1
{
id = table2Obj.Id,
table1Code = table1Obj.Table1Code,
reference = table1Obj.Reference
};
}
else if (t.GetType() == typeof (Table2Dto))
{
var table2Obj = t as Table2Dto;
if(table2Obj != null)
TranslatedObj = new table_2
{
id = table2Obj.Id,
table2Code = table2Obj.Table2Code,
reference = table2Obj.Reference
};
}
}
public object TranslatedObj { get; set; }
我将如何解决这个问题以保持代码干净和通用方法/映射器可以与任何数据网格一起使用? 提前致谢!
【问题讨论】:
标签: c# wpf database entity-framework mvvm