Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用其他属性名称从其他数据库导入数据_C#_Database_Entity Framework - Fatal编程技术网

C# 使用其他属性名称从其他数据库导入数据

C# 使用其他属性名称从其他数据库导入数据,c#,database,entity-framework,C#,Database,Entity Framework,所以我有2个数据库,1个SQLite文件,每周更新一次(所以我需要每周运行一次更新)。和一个SQLserver(但现在只使用SQLfile进行本地测试等)。然而,我正在寻找一种简单的方法将所有数据从SQLite文件复制到SQLserver,有10个类,它们存在于两个数据库中,除了SQLite在开始时没有大写字母,而SQLserver有 sqlite中有一个person表,其id、name和lastname。在SQLserver上,表名为Person(大写),列为Id Name和Lastname。

所以我有2个数据库,1个SQLite文件,每周更新一次(所以我需要每周运行一次更新)。和一个SQLserver(但现在只使用SQLfile进行本地测试等)。然而,我正在寻找一种简单的方法将所有数据从SQLite文件复制到SQLserver,有10个类,它们存在于两个数据库中,除了SQLite在开始时没有大写字母,而SQLserver有

sqlite中有一个person表,其id、name和lastname。在SQLserver上,表名为Person(大写),列为Id Name和Lastname。SQlite文件由第三方提供,我无法决定他们做什么。SQLserver是使用代码优先EF创建的。(我更喜欢把这一切都解释清楚)

有没有一种简单的方法来复制所有的数据,我在寻找类的属性循环,然后以lower为例

ForEach(var person in SQLiteDB.persons)
{
    Person thenewperson = new Person();
    foreach (var prop in person.GetType().GetProperties())
    {
        // Here I get stuck I want something like
        if(thenewperson.Haspropertie.ToLower(prop.GetName.ToLower) // This is incorrect but I think you ll understand if we do a ToLower then we can get it to work. Since only capitals are the things that are different.
        {
           //Then we copy the data to "thenewperson"
        }

    }
    SQlserverDB.Persons.AddorUpdate(thenewperson) // Not totaly correct but you get the point.
} 
我不确定我是否走对了方向,我在谷歌上搜索了如何循环属性,但没有找到复制数据的好方法。我还因为试图修复VS 2012以使用SQLite而头疼,但ADO.net似乎不起作用,所以我不得不再次安装VS2010等lol(现在运行这两个版本)

希望有人对此有一个很好的解决方案,如果你还有任何问题,请随时提问


编辑:我忘了提到它还有一个导航属性。(像人格)。这也需要复制

这应该完成您正在尝试的操作(未测试,可能失败):

但是,您可以通过预先计算属性映射来改进它,这样就不必为每个SQLiteDB.persons查找它

var propertyMapping = new Dictionary<PropertyInfo, PropertyInfo>();
var efPersonType = typeof(Person);
var sqlitePersonType = typeof(SQLLitePerson);

foreach (var prop in sqlitePersonType.GetProperties())
{
    var efProp = efPersonType.GetProperties()
                             .FirstOrDefault(p => p.Name.ToLower() == prop.Name.ToLower());
    if (efProp != null)
    {
        propertyMapping.Add(prop, efProp);
    }
}

foreach (var person in SQLiteDB.persons)
{
    Person thenewperson = new Person();
    foreach (var i in propertyMapping)
    {
        i.Value.SetValue(thenewperson, i.Key.GetValue(person, null), null);
    }
    SQlserverDB.Persons.AddorUpdate(thenewperson);
}
var-propertyMapping=new Dictionary();
var efPersonType=类型(个人);
var sqlitePersonType=typeof(SQLLitePerson);
foreach(sqlitePersonType.GetProperties()中的var prop)
{
var efProp=efPersonType.GetProperties()
.FirstOrDefault(p=>p.Name.ToLower()==prop.Name.ToLower());
如果(efProp!=null)
{
添加(prop,efProp);
}
}
foreach(SQLiteDB.persons中的变量person)
{
Person thenewperson=新的Person();
foreach(属性映射中的变量i)
{
i、 Value.SetValue(newperson,i.Key.GetValue(person,null),null);
}
SQlserverDB.Persons.AddorUpdate(newperson);
}
您还可以选择对象映射器,例如。然后,您可以创建自定义约定以使其正常工作

如果您有更复杂的实体,则应使用AutoMapper,而不是滚动您自己的映射解决方案以节省时间:


顺便说一句,最简单的方法是创建手写映射。

感谢您的快速回复,不过我认为在我找到一个集合之前,这一切都很顺利。类型为“System.Data.Objects.DataClasses.EntityCollection
1[DataImport.personAbility]”的对象无法转换为类型为“System.Data.Objects.DataClasses.EntityCollection
1[DataImport.Personability我不知道你的类中有导航属性。这让事情复杂化了。是的,很抱歉忘了提到它,这会让事情变得非常复杂吗:/?那么你应该使用功能齐全的对象映射器(AutoMapper)然后,您可以非常轻松地配置映射的各个方面。编写您自己的映射解决方案将花费更多的时间,而且这是一种容易出错的方法。或者您可以使用手写解决方案。好的,我现在将查看automapper,看看或者我可以通过这种方式修复它。
var propertyMapping = new Dictionary<PropertyInfo, PropertyInfo>();
var efPersonType = typeof(Person);
var sqlitePersonType = typeof(SQLLitePerson);

foreach (var prop in sqlitePersonType.GetProperties())
{
    var efProp = efPersonType.GetProperties()
                             .FirstOrDefault(p => p.Name.ToLower() == prop.Name.ToLower());
    if (efProp != null)
    {
        propertyMapping.Add(prop, efProp);
    }
}

foreach (var person in SQLiteDB.persons)
{
    Person thenewperson = new Person();
    foreach (var i in propertyMapping)
    {
        i.Value.SetValue(thenewperson, i.Key.GetValue(person, null), null);
    }
    SQlserverDB.Persons.AddorUpdate(thenewperson);
}