• C# CodeFirst编程模型一


    定义实体类型:

    定义两个实体Menu和MenuCard,一个menu关联一个menucard,menucard包含对所有menu的引用。

     public class Menu
        {
            public int Id { get; set; }
    
            [StringLength(50)]
            public string Text { get; set; }
            public decimal Price { get; set; }
            public DateTime? Date { get; set; }
            public MenuCard MenuCard { get; set; }
            public int MenuCardId { get; set; }
        }
    

      

    public class MenuCard
        {
            public int Id { get; set; }
            public string Text { get; set; }
            public virtual ICollection<Menu> Menus { get; set; }
        }
    

      创建数据上下文,新建类MenuContext派生于基类DbContext,使用模型构建器定义各个字段的约束和各表之间的级联关系,需要引用EntityFramework程序集。

     public class MenuContext:DbContext
        {
            public MenuContext():base(GetConnectionString())
            {
            }
    
            /// <summary>
            /// Get the connection string to connect database
            /// </summary>
            /// <returns>connection string</returns>
            private static string GetConnectionString()
            {
                ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["CodeFirst"];
                return settings.ConnectionString;
            }
           
            public DbSet<Menu> Menus { get; set; }
            public DbSet<MenuCard> MenuCards { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Menu>().Property(m => m.Price).HasColumnType("money");
                modelBuilder.Entity<Menu>().Property(m => m.Date).HasColumnType("date");
                modelBuilder.Entity<Menu>().Property(m => m.Text).HasMaxLength(40).IsRequired();
                modelBuilder.Entity<Menu>().HasRequired(m => m.MenuCard).WithMany(c => c.Menus).HasForeignKey(m => m.MenuCardId);
                modelBuilder.Entity<MenuCard>().Property(c => c.Text).HasMaxLength(30).IsRequired();
                modelBuilder.Entity<MenuCard>().HasMany(c => c.Menus).WithRequired().WillCascadeOnDelete();
            }
        }
    

      创建数据库,填充数据。数据库初始化实现了IDatabaseInitializer<TContext>接口,这个接口由CreateDatabaseIfNotExists、DropDatabaseAlways和DropDatabaseIfModelChanges实现,新建类MenuCardInitializer

    public class MenuCardsInitializer:DropCreateDatabaseAlways<MenuContext>
        {
            protected override void Seed(MenuContext context)
            {
                var menuCards = new List<MenuCard>()
                {
                    new MenuCard {
                        Text ="Soups",Menus=new List<Menu>(){
                        new Menu {
                            Text = "Baked Potatoe Soup",Price=4.80m,Date=DateTime.Parse("5/22/2016",System.Globalization.CultureInfo.InvariantCulture)
                        },
                        new Menu {
                            Text="Rib Eye Steak",Price=5.20m,Date=DateTime.Parse("5/21/2016",System.Globalization.CultureInfo.InvariantCulture)
                        }
                        }
                    },
                    new MenuCard {
                        Text ="Steaks",Menus=new List<Menu>() {
                        new Menu {
                        Text="New York Sirloin Steak",
                        Price=6.28m,Date=DateTime.Parse("5/20/2016",System.Globalization.CultureInfo.InvariantCulture)},
                        new Menu {
                        Text="Rib Eye Steak",Price=7.20m,Date=DateTime.Parse("5/19/2016",System.Globalization.CultureInfo.InvariantCulture)}
                        }
                    }
                };
                menuCards.ForEach(c => context.MenuCards.Add(c));
            }
        }
    

      在program类中运行:

    class Program
        {
            static void Main(string[] args)
            {
    
                //CreateMenus().Wait();
                QueryMenu();
            }
    
            /// <summary>
            /// crwate data to test entity framework 
            /// </summary>
            /// <returns></returns>
            private static async Task CreateMenus()
            {
                using (var data = new MenuContext())
                {
                    MenuCard card = data.MenuCards.Create();
                    card.Text = "Soups";
                    data.MenuCards.Add(card);
                    Menu m = data.Menus.Create();
                    m.Text = "Baked Potato Soup";
                    m.Price = 4.80m;
                    m.Date = new DateTime(2016, 5, 22);
                    m.MenuCard = card;
                    data.Menus.Add(m);
                    Menu m1 = data.Menus.Create();
                    m1.Text = "Cheddar Broccoli Soup";
                    m1.Price = 5.06m;
                    m1.Date = new DateTime(2016, 5, 21);
                    m1.MenuCard = card;
                    data.Menus.Add(m1);
                    try
                    {
                        data.SaveChanges();
                    }
                    catch(Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
    
            private static void QueryMenu()
            {
                using (var data = new MenuContext())
                {
                    foreach (var card in data.MenuCards)
                    {
                        Console.WriteLine(card.Text);
                        foreach (var menu in card.Menus)
                        {
                            Console.WriteLine("{0}-{1:d}", menu.Text, menu.Date);
                        }
                    }
                }
            }
        }
    

      

  • 相关阅读:
    力扣(LeetCode)验证回文串 个人题解(C++)
    力扣(LeetCode)平方数之和 个人题解
    Exclusive Access 2 UVA
    C语言中指针*p[N], (*P)[N]的区别
    2018年蓝桥杯国赛比赛心得
    2018acm/icpc西安邀请赛比赛心得
    [最小割]Cable TV Network UVA
    Tree Reconstruction UVA
    Twenty Questions UVA
    python中的enumerate 函数(编号的实现方式)
  • 原文地址:https://www.cnblogs.com/simen-tan/p/5518471.html
Copyright © 2020-2023  润新知