0

我正在使用 ASP.NET MCV4、EF6、Code-First 模型开展一个学校项目。现在,我想知道如何用示例数据填充数据库。我检查了migrations,但我不想弄乱数据库结构。我只想插入数据,我试过这个:

namespace Autokereskedes.Models
{
    public class _SampleData : DropCreateDatabaseIfModelChanges<AutoDb>
    {
        protected override void Seed(AutoDb context)
        {
            new Autokereskedes.Models.SampleData.Users().List().ForEach(u=>context.Users.Add(u));

            new Autokereskedes.Models.SampleData.Cars().List().ForEach(c => context.Cars.Add(c));

        }
    }
}

namespace Autokereskedes.Models.SampleData
{
    public class Users
    {
        public List<User> List()
        {
            var crypto = new SimpleCrypto.PBKDF2();
            var salt = Autokereskedes.Controllers.AccountController.PasswordSalt;
            return new List<User> 
            {
                new User { 
                    UserId = Guid.NewGuid(), 
                    Email = "admin@autoker.hu", 
                    Password = crypto.Compute("admin",salt),
                    Phone = "+36 20 XXX YYZZ",
                    Banned = false,
                    Country = "Hungary",
                    City = "Szeged",
                    Street = "DivisonByZero street 1/0",
                    ZipCode = 1100,
                    RegistrationDate = DateTime.Now
                },
                new User { 
                    UserId = Guid.NewGuid(), 
                    Email = "user@autoker.hu", 
                    Password = crypto.Compute("user",salt),
                    Phone = "+36 20 XXX YYZZ",
                    Banned = false,
                    Country = "Hungary",
                    City = "Szeged",
                    Street = "DivisonByZero street 2/0",
                    ZipCode = 1100,
                    RegistrationDate = DateTime.Now
                }
            };
        }
    }
}

它正在工作,我想。但是我应该如何插入具有外键的数据呢?我看到了一个教程,其中他们为所有 List<>-s 使用了一个文件,并且在外键字段中使用了类似这样的内容:Genre = genres.Single(g => g.Name == "Jazz"). 我现在真的无法复制。

namespace Autokereskedes.Models.SampleData
{
    public class Cars
    {
        public List<Car> List()
        {
            return new List<Car>
            {
                new Car {
                    CarId = Guid.NewGuid(),
                    DepoId = now what
                },
                new Car {

                }
            };
        }
    }
}
4

3 回答 3

2

当您播种数据时,您需要考虑外键关系......最终。

return new List<Car>
{
    new Car {
        CarId = Guid.NewGuid(),
        DepoId = now what // it depends, is this a required relationship?
    },
    new Car {
    }
};

如果 DepoId 是可选关系,您可以等到拥有 Depo 和 DepoId 后再设置此属性。否则,如果需要,则需要在将其插入上下文之前进行设置。

protected override void Seed(AutoDb context)
{
    new Autokereskedes.Models.SampleData.Users().List()
        .ForEach(u=>context.Users.Add(u));
    var cars = new Autokereskedes.Models.SampleData.Cars().List();
    var depos = new Autokereskedes.Models.SampleData.Depos().List();
    foreach (var car in cars)
    {
        car.DepoId = depos.FirstOrDefault(x => x.DepoId == ...?);

        context.Cars.Add(car);
    }
}

我想问题是,你如何决定应该为每辆车分配哪个仓库?

另一种方法是,因为您的 Depo 实体是一个依赖项,并且您需要先解决它们,所以将您的 depos 传递给您的 cars list 方法:

var depos = new Autokereskedes.Models.SampleData.Depos().List();
depos.ForEach(d => context.Depos.Add(d));
//context.SaveChanges(); no need for this since your id's are Guid's
var cars = new Autokereskedes.Models.SampleData.Cars().List(depos);

public List<Car> List(IEnumerable<Depo> depos)
{
    // now you have depos to look for id's in
    return new List<Car>
    {
        new Car {
            CarId = Guid.NewGuid(),
            DepoId = depos.SingleOrDefault(x => [your predicate]),
        },
        new Car {
        }
    };
}
于 2013-11-06T12:50:14.760 回答
0

该过程称为“播种”数据。

您创建一个初始化对象并覆盖 Seed 方法:

public class MyDataContextDbInitializer : DropCreateDatabaseIfModelChanges<MyDataContext>
{
   protected override void Seed(MagazineContext context)
   {
     context.Customers.Add(new Customer() { CustomerName = "Test Customer" });
   }
} 

这是一篇描述如何做到这一点的文章:http: //www.codeproject.com/Articles/315708/Entity-Framework-Code-First-Data-Initializers

于 2013-11-06T12:48:35.733 回答
0

我制作了一个 Nuget 包,因此您可以生成随机联系数据(名字、姓氏、城市、邮政编码、生日、帐号等)

在此版本中,您可以导出为 CSV、XML、JSON 和 SQL。

打开 Visual Studio,管理 Nuget 包在线搜索:

DSharp 框架:ContactGenerator

欢迎任何关于扩展功能的建议。

于 2015-01-16T09:26:57.217 回答