首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码优先方法,输入表

代码优先方法,输入表
EN

Code Review用户
提问于 2015-12-16 14:47:22
回答 2查看 115关注 0票数 8

我有一个数据库(PostgreSQL),我想从它将一些数据迁移到MS数据库。我决定使用代码优先的方法。这个问题与我的新桌子的正确进料方式有关。

Model.cs:

代码语言:javascript
复制
public class Info 
{
    [Key]
    public int InfoID { get; set; }   
    public int NameID { get; set; }    
    public string Name { get; set; }
}

DatabaseInitializer:

代码语言:javascript
复制
  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检索我需要的数据。这样做合适吗?查询越复杂,代码就越复杂,所以以后可能很难维护,不是吗?你会用什么方法?

此外,这样的数据输入可能会花费大量的内存,以防表很大。是否有可能避免内存泄漏?

EN

回答 2

Code Review用户

回答已采纳

发布于 2015-12-16 15:00:37

变量应该使用camelCase大小写命名,请参阅网络命名准则 so Infos -> infosUsr -> usr,但如果不使用任何名称的缩写,则应该将其更改为users,这要容易得多。同样的规则也适用于r vs readercom vs command

始终使用大括号{},尽管它们可能是可选的,但这样可以减少代码出错的可能性。

代码语言:javascript
复制
foreach (var user in Users)
{
    context.Infos.Add(user);
}  

我不知道这些Users是从哪里来的,也不知道context.Infos类型是什么,但是如果它是一个List<T>,您可以使用AddRange()方法同时添加它们,就像context.Infos.AddRange(Users);一样。

它必须填充一个事后不使用的List<Info>,这意味着什么?

拥有包含查询的静态类是可以的,但至少应该添加一些可能性来添加自定义查询。

票数 7
EN

Code Review用户

发布于 2015-12-17 14:47:16

首先,您的迁移服务应该在

代码语言:javascript
复制
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可能看起来就像

代码语言:javascript
复制
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个元素批中更新它们的事务。

如果数据量很大,则存在资源饱和的风险。则不选择所有数据。

代码语言:javascript
复制
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语句,或者像您已经做的那样,在服务器端过程中这样做。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/114171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档