背景:
简单地说,我目前正在开发一个使用 ASP.NET MVC 和实体框架的应用程序,它定期从 XML 提要中提取数据并将数据保存到数据库中,添加新记录和/或更新现有记录。
我当前的方法是检索 XML 提要(使用 XmlReader 将 XML 数据反序列化为从该xsd.exe
工具创建的类)。然后,我遍历检索到的 XML 数据集合,创建和水合 EF 类/实体(通过 EF Power Tools 和逆向工程师代码优先方法创建)并将这些新的/更新的实体中的每一个保存到数据库中。
例子
在此示例中,我正在处理检索位置。DB 有一个Location
表和一个表,在和LocationType
之间具有一对多的关系。对=有外键约束。LocationType
Location
Location
Location.LocationTypeId
LocationType.LocationTypeId
我需要验证数据库中是否存在 XML 位置,因此我首先使用 XML 提要位置 ID 检索它:如果它为空,我正在处理一个新位置;如果它不为空,那么我正在处理现有位置,我需要更新它。
// LOCATION SERVICE
private void LoadLocations()
{
// retreive XML location data
List<locationsLocation> locationsFeed = _xmlFeedRepository.GetLocations().ToList();
// iterate through each location and save to DB
foreach (var fl in locationsFeed)
{
// get location from DB using XML location feedId
var location = _locationRepository.GetLocationByFeedId(fl.id);
if (location == null)
{
// add location
HydrateLocation(ref location, fl);
_locationRepository.AddLocation(location);
}
else
{
// update location
HydrateLocation(ref location, fl);
_locationRepository.UpdateLocation(location);
}
}
}
private void HydrateLocation(ref Location location, locationsLocation fl)
{
if (location == null)
{
// create new location
location = new Location();
}
// get location type
var locationType = _locationRepository.GetLocationTypeByName(fl.type);
location.Name = fl.name;
location.FeedId = fl.id;
// add existing locationType or create new locationType
location.LocationType = locationType ?? new LocationType { Name = fl.type };
}
// LOCATION REPOSITORY
public void AddLocation(Location location)
{
if (location != null)
{
using (var context = new MyDBContext())
{
context.Locations.Add(location);
context.SaveChanges();
}
}
}
public void UpdateLocation(Location location)
{
if (location != null)
{
using (var context = new MyDBContext())
{
context.Locations.Attach(location);
context.Entry(location).State = EntityState.Modified;
context.SaveChanges();
}
}
}
public Location GetLocationByFeedId(int feedId)
{
Location location = null;
if (feedId > 0)
{
using (var context = new MyDBContext())
{
location = context.Locations.FirstOrDefault(l => l.FeedId == feedId);
}
}
return location;
}
问题/关注
这是添加/更新具有相关实体的实体的正确方法,例如,添加/更新位置及其 locationType?任何人都可以建议这样做的首选方式吗?