0

ASP.NET MCV4、EF6、Code-First モデルを使用して学校のプロジェクトに取り組んでいます。ここで、データベースにサンプル データをどのように入力すればよいか考えています。をチェックmigrationsしましたが、db 構造をいじりたくありません。データを挿入したいだけで、これを試しました:

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 に答える