【问题标题】:Using List or Collection to Seed data with EF Code First通过 EF Code First 使用列表或集合来播种数据
【发布时间】:2012-06-07 20:33:39
【问题描述】:

我正在为我的开发数据库添加一些种子数据。我所拥有的似乎相当笨重,有没有办法使用某种 IEnumerable 类型(例如 List 或集合)来使这更容易?

public class MusicDBInit : DropCreateDatabaseIfModelChanges<MusicContext>
{
    protected override void Seed(MusicContext db)
    {
        Band bvs = new Band { Name = "Bear vs Shark", Members = 4 };
        Band circa = new Band { Name = "Circa Survive", Members = 4 };
        Band dam = new Band { Name = "Damiera", Members = 3 };

        db.Bands.Add(bvs);
        db.Bands.Add(circa);
        db.Bands.Add(dam);

        base.Seed(db);
    }
}

【问题讨论】:

  • 您是否希望像AddRange 这样一次性添加多个乐队?
  • 我不确定 AddRange(我只是不知道它的功能)但是是的,我想一次性添加几个波段。

标签: c# .net asp.net-mvc-3 ienumerable ilist


【解决方案1】:

尝试这样的事情(就像在Online Music Store MVC Sample中所做的那样:

 var bands = new List<Band>{
                     new Band { Name = "Bear vs Shark", Members = 4 },
                     new Band { Name = "Circa Survive", Members = 4 },
                     new Band { Name = "Damiera", Members = 3 }
 };


bands.ForEach(x=> db.Bands.Add(x));

【讨论】:

  • 这正是我想要的,谢谢。在尝试此操作时,我一直在弄乱语法,因为我试图在我的列表中为每个波段分配一个变量名,回想起来这是完全没有必要的。
【解决方案2】:

我通常采用的另一种方法是从 XML 文件加载种子数据。一个单独的类将包含以下内容:

    private XmlNodeList readNodes(String xmlFilePath, String nodeName)
    {
        FileStream reader = new FileStream(xmlFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        System.Xml.XmlDocument source = new System.Xml.XmlDocument();
        source.Load(reader);
        return source.GetElementsByTagName(nodeName);
    }

    public List<Band> readBands(String xmlFilePath)
    {
        List<Band> results = new List<Band>();
        foreach (XmlNode node in readNodes(xmlFilePath, "Band"))
        {
            results.Add(new Band { Members = node.Attributes["members"].Value, Name = node.Attributes["name"].Value });
        }
        results.Sort();
        return results;
    }

然后将以下内容添加到您的 Seed 方法中:

    foreach (Band b in seeder.readBands(AppDomain.CurrentDomain.BaseDirectory + "App_Data\\Bands.xml"))
    {
        db.bands.Add(b);
    }

您的 XML 将如下所示,并位于您的 App_Data 目录下。

<?xml version="1.0" encoding="UTF-8"?>
<bands>
    <band name="Bear vs Shark" members="4" />
    <band name="Circa Survive" members="4" />
    <band name="Damiera" members="3" />
</bands>

然后,您可以为每个要播种的表创建种子方法和 XML 文件。请记住,由于您使用的是Add 而不是AddOrUpdate,因此您很可能会在Seed 运行时添加重复项。

【讨论】:

  • 感谢您的回答——对于更大规模的项目以及能够将种子数据复制到每个新项目,这可能是一个更好的解决方案,但对于这个特定的实例,我想迭代相当小的数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2012-01-16
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多