我有小型 WPF 应用程序。解决方案中有 5 个项目。
我想要使用 UI ENTITIES 单独的 DOMAIN 类,并且我想使用 AUTOMAPPER。
您可以在此处下载整个解决方案:TestWPFAutomapper.zip
具有 UI 实体(Entities.Destination.cs)的域类(Domain.Source.cs)具有相同的签名。
在 Entities.Destination.cs 我想加入其他逻辑。
namespace DOMAIN
{
public class Source
{
public int Id { get; set; }
public int Position { get; set; }
}
}
using System.ComponentModel;
namespace ENITITIES
{
public class Destination : INotifyPropertyChanged
{
private int _id;
private int _position;
public int Id
{
get { return _id; }
set
{
_id = value;
OnPropertyChanged("Id");
}
}
public int Position
{
get { return _position; }
set
{
_position = value;
OnPropertyChanged("Position");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的数据来自使用带有 CodeFirst 的实体框架的 DAL.DataContext。在这里,我正在使用 Source 类。
using System.Data.Entity;
using DOMAIN;
namespace DAL
{
public class DataContext : DbContext
{
public DbSet<Source> Sources { get; set; }
}
}
映射位于 BL.MyAppLogic.cs 中。在这个类中,我有属性 Items,它是 ObservableCollection。
将另一个项目放入数据库后,源类集合得到刷新,但目标不刷新。
using System.Collections.ObjectModel;
using System.Data.Entity;
using System.Linq;
using AutoMapper;
using DAL;
using DOMAIN;
using ENITITIES;
namespace BL
{
public class MyAppLogic
{
private readonly DataContext _dataContext = new DataContext();
public ObservableCollection<Source> Items { get; set; }
//public ObservableCollection<Destination> Items { get; set; }
public MyAppLogic()
{
Database.SetInitializer(new MyInitializer());
Mapping();
_dataContext.Sources.Load();
Items = _dataContext.Sources.Local;
//Items = Mapper.Map<ObservableCollection<Source>, ObservableCollection<Destination>>(_dataContext.Sources.Local);
}
private void Mapping()
{
Mapper.CreateMap<Source, Destination>().ReverseMap();
// I tried also Mapper.CreateMap<ObservableCollection<Source>, ObservableCollection<Destination>>().ReverseMap();
}
public int GetLastItem()
{
return _dataContext.Database.SqlQuery<int>("select Position from Sources").ToList().LastOrDefault();
}
public void AddNewItem(Destination newItem)
{
_dataContext.Sources.Add(Mapper.Map<Destination, Source>(newItem));
_dataContext.SaveChanges();
}
}
}
我的问题不在于映射,这很好用,而是在从数据库中添加或删除项目后刷新集合。如果我使用 DOMAIN.Source 类一切正常,集合令人耳目一新。但是当我使用 ENTITIES.Destination 数据来自数据库时,我也可以将一些新数据放入数据库,但重新定义 ObservableCollection 不起作用。
请尝试在 BL.MyAppLogic.cs 中注释行(14 和 23)并取消注释(15 和 24),你会明白我的意思。
感谢您的任何帮助。