我应该使用哪个实体框架初始化程序来永久存储我的数据?

时间:2014-11-15 21:54:04

标签: c# winforms entity-framework

我正在写一个小项目,我遇到了一些我无法处理的问题。首次启动我的应用程序时,我希望用一些示例数据填充它。我是用这个课做的:

public class ExampleDataFiller
{
    public BloodBankContext bloodBankContext;
    public List<BloodDonor> ExampleDonators;
    public ExampleDataFiller (BloodBankContext bloodBankContext)
    {
        this.bloodBankContext = bloodBankContext;
        ExampleDonators=new List<BloodDonor>();


        BloodDonor bloodDonor1 = new BloodDonor()
        {
            FirstName="Marcus",
            LastName="Wilkins",
            DateofBirth=new DateTime(1960, 10, 27),
            DateOfRegistration=DateTime.Now,
            BloodType=BloodTypes.ABRHminus,


        };
        ExampleDonators.Add(bloodDonor1);

        BloodDonor bloodDonor2 = new BloodDonor()
        {
            FirstName = "Raul",
            LastName = "Davies",
            DateofBirth = new DateTime(1958, 08, 26),
            DateOfRegistration = DateTime.Now,
            BloodType = BloodTypes.ARHminus,


        };
        ExampleDonators.Add(bloodDonor2);

        BloodDonor bloodDonor3 = new BloodDonor()
        {
            FirstName = "Richard",
            LastName = "Lance",
            DateofBirth = new DateTime(1981, 07, 02),
            DateOfRegistration = DateTime.Now,
            BloodType = BloodTypes.ORHplus,


        };
        ExampleDonators.Add(bloodDonor3);

        BloodDonor bloodDonor4 = new BloodDonor()
        {
            FirstName = "Leonard",
            LastName = "Spencer",
            DateofBirth = new DateTime(1955, 06, 03),
            DateOfRegistration = DateTime.Now,
            BloodType = BloodTypes.ARHplus,


        };
        ExampleDonators.Add(bloodDonor4);

        BloodDonor bloodDonor5 = new BloodDonor()
        {
            FirstName = "Jennifer",
            LastName = "Hays",
            DateofBirth = new DateTime(1960, 01, 13),
            DateOfRegistration = DateTime.Now,
            BloodType = BloodTypes.ARHplus,


        };
        ExampleDonators.Add(bloodDonor5);

        foreach (var donor in ExampleDonators)
        {
            bloodBankContext.BloodDonors.Add(donor);
            bloodBankContext.SaveChanges();
        }

    }


}

我的应用程序允许用户在数据库中添加/删除/编辑数据。只要应用程序正在运行,所有这些似乎都能正常工作。 我关闭它然后重新开始的那一刻所有的变化都消失了。这是我的DBContext类:

public class BloodBankContext: DbContext
{
    public BloodBankContext() : base("BloodBankDatabase1") 
    {
        Database.SetInitializer<BloodBankContext>(new DropCreateDatabaseAlways<BloodBankContext>());
    }
    public DbSet<BloodDonor> BloodDonors { get; set; }
    public DbSet<BloodDonation> BloodDonations { get; set; }
    public DbSet<StoredBlood> storedBlood { get; set; }    
}

我知道这是由于我正在使用的初始化程序的事实: DropCreateDatabaseAlways 但我一直在玩其他2个初始化程序,甚至编写了我自己的程序,但似乎没有什么对我有用。我唯一能做到的就是将我在数据库中的记录加倍。以下是我开始申请的方式:

public partial class BloodBankManager : Form
{
    public static BloodBankContext context;
public BloodBankManager()
    {
        InitializeComponent();
        context = new BloodBankContext();
        ExampleDataFiller exampleDataFiller = new ExampleDataFiller(context);
        dataGridView1.DataSource = context.BloodDonors.Local.ToBindingList();

        comboBox1.DataSource = Enum.GetValues(typeof(BloodTypes));

    }
}

所以我的问题是:在应用程序发布之间存储数据的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您不需要设置任何初始值设定项,但您的类必须设置一次此数据,并在再次添加数据库之前检查数据库中是否已有数据。

因此,如果您想要保持数据的原样,则需要将初始值设置为null

所以,像这样:

public class BloodBankContext : DbContext
        {
            public BloodBankContext()
                : base("BloodBankDatabase1")
            {
                Database.SetInitializer<BloodBankContext>(null); // this means that keep the database data as it is and don't change it.
            }
            public DbSet<BloodDonor> BloodDonors { get; set; }
            public DbSet<BloodDonation> BloodDonations { get; set; }
            public DbSet<StoredBlood> storedBlood { get; set; }
        }

你可以做这样的事情来检查数据是否已经初始化

     public ExampleDataFiller (BloodBankContext bloodBankContext)
        {
            this.bloodBankContext = bloodBankContext;

            // Only initialize the data if none is there
            if(!bloodBankContext.BloodDonors.Any())
            {
                 ExampleDonators=new List<BloodDonor>();

                 var bloodDonor1 = new BloodDonor()
                 {
                     FirstName="Marcus",
                     LastName="Wilkins",
                     DateofBirth=new DateTime(1960, 10, 27),
                     DateOfRegistration=DateTime.Now,
                     BloodType=BloodTypes.ABRHminus,
                 };

                 //.
                 //.
                 //.
                 // etc
            }
        }

希望有所帮助。