0

我有一个数据库,其中包含各种对象的映射值表。

例如,Colour表包含BLK > Black, BLU > BLUE, ORA > ORANGE等...而CarType表包含4DH > Four-door hatchback, 4WD > Four wheel drive等...

我首先使用实体​​框架代码,所以我有一个类似这样的上下文设置。

public class MappingContext : DbContext
{
    public MappingContext ()
        : base("Mappings")
    {
    }

    public DbSet<Colour> ColourMappings { get; set; }
    public DbSet<CarType> CarTypeMappings { get; set; }
}

与我的数据库中的每个表相关的每个对象都Mapping继承自一个基类,如下所示:

public class Mapping
{
    public int Id { get; set; }

    public string OrignalValue { get; set; }

    public string MappedValue { get; set; }
}

public class CarType : Mapping{}
public class Colour : Mapping{}

现在我要做的是从一个填充了“模板”的 XML 文件中读取这些映射,其中包含映射并将它们插入数据库中。

我有以下方法可以做到这一点:

public void InsertMappings(XDocument xml, string templateName, Type typeToInsert)
{
    // Here I find the relevent mappings 

    using (var repo = new Repository())
    {
        var mapppings = mappings.Select(mapping => new Mapping
        {
            MappedValue = mapping.Value,
            OrignalValue = GetCode(mapping)
        });

        foreach (var mapping in mapppings.ToList())
        {
            var map = (typeToInsert)mapping  // << This line will not compile

            repo.Insert(map);
        }

    repo.Save();
   }
}

这将不符合要求,因为它无法识别尝试的强制转换“(typeToInsert)mapping”。

所以基本上我需要知道的是在将它插入数据库时​​如何将这个映射对象转换为特定的映射对象?或者任何关于更好的方法的建议!

4

1 回答 1

1

从它的外观来看,您正试图将一个实例转换Mapping为 aCarTypeColour它不起作用,因为Mapping它对这些类型一无所知,因为它是类。

您的代码需要创建具体类型的实例,即typeToInsert并将其转换为Mapping. 您可以执行以下操作:

public void InsertMappings(XDocument xml, string templateName, Type typeToInsert)
{
    // Here I find the relevent mappings 

    using (var repo = new Repository())
    {
        foreach (var m in mappings)
        {
            // XML -> Entity
            var mapping = (typeToInsert)Activator.CreateInstance(typeToInsert);
            (mapping as Mapping).MappedValue = m.Value;
            (mapping as Mapping).OriginalValue = GetCode(m);
            // Update database
            repo.Insert(mapping);
        }
        repo.Save();
   }
}

您可能也应该在这里使用泛型,您可以将您的方法重构为:

public void InsertMappings<T>(XDocument xml, string templateName)
{
    // Here I find the relevent mappings 

    using (var repo = new Repository())
    {
        foreach (var m in mappings)
        {
            // XML -> Entity
            var mapping = (T)Activator.CreateInstance(typeof(T));
            (mapping as Mapping).MappedValue = m.Value;
            (mapping as Mapping).OriginalValue = GetCode(m);
            // Update database
            repo.Insert(mapping);
        }
        repo.Save();
   }
}

用法

InsertMappings<CarType>(xmlDoc, "CarTemplate");
InsertMappings<Colour>(xmlDoc, "ColourTemplate");
于 2012-10-12T11:34:51.877 回答