我有一个数据库(PostgreSQL),我想从它将一些数据迁移到MS数据库。我决定使用代码优先的方法。这个问题与我的新桌子的正确进料方式有关。
public class Info
{
[Key]
public int InfoID { get; set; }
public int NameID { get; set; }
public string Name { get; set; }
} private void SeedInfos(SomeContext context)
{
var Infos = new List<Info>();
using (var com = new NpgsqlCommand(PostgresSQLs.GetAllInfos, EstablishedConnection()))
{
using (var r = com.ExecuteReader())
{
while (r.Read())
{
Infos.Add(new Info { InfoID= Convert.ToInt32(r["infoID"]), NameID = Convert.ToInt32(r["NameId"]), Name = r["Name"].ToString()});
};
}
}
foreach (var Usr in Users)
context.Infos.Add(Usr);
}我关注的一个问题与静态类PostgreSQL有关,在那里我存储查询,这些查询正在从PostgreSQL检索我需要的数据。这样做合适吗?查询越复杂,代码就越复杂,所以以后可能很难维护,不是吗?你会用什么方法?
此外,这样的数据输入可能会花费大量的内存,以防表很大。是否有可能避免内存泄漏?
发布于 2015-12-16 15:00:37
变量应该使用camelCase大小写命名,请参阅网络命名准则 so Infos -> infos和Usr -> usr,但如果不使用任何名称的缩写,则应该将其更改为users,这要容易得多。同样的规则也适用于r vs reader和com vs command。
始终使用大括号{},尽管它们可能是可选的,但这样可以减少代码出错的可能性。
foreach (var user in Users)
{
context.Infos.Add(user);
} 我不知道这些Users是从哪里来的,也不知道context.Infos类型是什么,但是如果它是一个List<T>,您可以使用AddRange()方法同时添加它们,就像context.Infos.AddRange(Users);一样。
List<Info>,这意味着什么?拥有包含查询的静态类是可以的,但至少应该添加一些可能性来添加自定义查询。
发布于 2015-12-17 14:47:16
首先,您的迁移服务应该在
public class MigrationService : IMigrationService
{
private readonly IDatabaseContext _postgreContext;
private readonly IDatabaseContext _mssqlContext;
public ContactDataService(IDatabaseContext postgreContext, IDatabaseContext mssqlContext)
{
if (postgreContext == null) throw new ArgumentNullException(nameof(postgreContext));
if (mssqlContext == null) throw new ArgumentNullException(nameof(mssqlContext));
_navServiceContext = navServiceContext;
_mssqlContext = mssqlContext;
}
public void ImportInfosSeedData()
{
var infos = _postgreContext.GetInfosData();
_mssqlContext.PostInfosData(infos);
}
}如果不使用过程,GetInfosData和PostInfosData可能看起来就像
public IEnumerable<User> GetInfosData(){
return _postgreContext.Infos.Select(o => MapToUser(o));
}
public void PostInfosData(IEnumerable<User> users){
foreach (var user in users)
context.Infos.Add(user);
_mssqlContext.SaveChanges();
}但是,请注意,您可以将多少项保存到上下文中,这是有限制的。我假设这个数字是种子数据,并且集合的大小小于100个实例。如果您需要添加数百万,那么您将需要创建一个在ex:多达1000个元素批中更新它们的事务。
如果数据量很大,则存在资源饱和的风险。则不选择所有数据。
public IEnumerable<User> GetInfosData(int count = 0, int amount = 1000){
return _postgreContext.Infos.Skip(amount * count).Take(amount).Select(o => MapToUser(o));
}这假设数据库表具有主键和具体顺序,并且在运行时不添加新元素。如果它没有排序,则可以使用数据排序的视图。
有些数据库不提供完全的C# lamba支持,例如:。您可能需要重新表述select语句,或者像您已经做的那样,在服务器端过程中这样做。
https://codereview.stackexchange.com/questions/114171
复制相似问题