C# 使用属性名将类转换为EF类
我有很多类似于下面所示的类。这些类都在名称空间C# 使用属性名将类转换为EF类,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有很多类似于下面所示的类。这些类都在名称空间API_类中;它们在另一个名为Database\u Classes的名称空间中有一些非常相似的对应项(同样,请参见下文) API_类 public class Recipe { public int Id { get; set; } public string Name { get; set; } public bool IsActive { get; set; } public List<Ingredient&
API_类中
;它们在另一个名为Database\u Classes
的名称空间中有一些非常相似的对应项(同样,请参见下文)
API_类
public class Recipe
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public List<Ingredient> Ingredients { get; set; }
//....lots of other properties, some lists, some single values
}
public class Ingredient
{
public int Id { get; set; }
public string Name { get; set; }
public List<SubRecipe> SubRecipes { get; set; }
//....lots of other properties, some lists, some single values
}
公共类配方
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool IsActive{get;set;}
公共列表成分{get;set;}
//…许多其他属性,一些列表,一些单一值
}
公共类成分
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表子配方{get;set;}
//…许多其他属性,一些列表,一些单一值
}
数据库类
public partial class Recipe
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Recipe()
{
this.Ingredients = new HashSet<Ingredient>();
this.SubRecipes = new HashSet<SubRecipe>)();
}
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Ingredient> Ingredients { get; set; }
// and more properties, matching the AP_Class that is called the same thing
}
public partial class Ingredient
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Ingredient()
{
this.SubRecipes = new HashSet<SubRecipe>();
}
public int Id { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<SubRecipe> SubRecipes { get; set; }
// and more properties, matching the AP_Class that is called the same thing
}
公共部分类配方
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共配方()
{
this.components=newhashset();
this.SubRecipes=newhashset();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool IsActive{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection组件{get;set;}
//和更多属性,匹配被称为同一事物的AP_类
}
公共部分类成分
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共成分()
{
this.SubRecipes=new HashSet();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection子配方{get;set;}
//和更多属性,匹配被称为同一事物的AP_类
}
我需要使用现有的API类并使用它们初始化数据库类。所有类都与对应的类和属性具有相同的名称。区别在于数据库类是由Entity Framework 6创建的,并且包含虚拟哈希集而不是列表。当类和属性名都存在于两个类集中时,是否有某种通用方法可以从“匹配”API类初始化一组数据库类,而不必写出每个属性和每个类,使它们都匹配
我花了一些时间在谷歌上搜索,因为我认为应该有一种使用反射的方法,但老实说,我正在努力找到搜索我看到的问题所需的语法。除此之外,还有将列表转换为哈希集的问题。我认为这种转换不应该是一个问题(),但在我看来,它可能会妨碍完全直接的类创建(尽管我知道列表中的值总是唯一的)
任何指针或示例都会对我很有帮助-我现在有大约80个类要学习,每个类都有很多属性;我希望避免写出从一组类到另一组类的整个转换 你不需要反思。只需确保使用这些类的所有类中的完整路径名相同即可。完整路径名包括名称空间和父/子类名。对不起,我不确定我是否理解-类名匹配,但名称空间不匹配;你是说我应该把所有的类放在一个名称空间还是。。。?很抱歉,如果您使用来自两个命名空间的同一类定义,那么我认为我缺少了一些内容,即只有一个命名空间中的类和使用完整路径的第二个命名空间中的引用。你不应该有两本同一门课。很抱歉,我觉得自己在这里像个白痴,但我不知道你的意思。类定义不完全匹配,每对中都有一个是从EF6生成的,所以我不想编辑它。我看到了这些类,API导入返回了其他类,我也看到了这些类。我想根据API类的定义将其转换为数据库类,但不确定如何实现。您可以尝试使用automapper from,然后使用IMapper执行
IMapper#Map(配料)
将值映射到dto(api)类。