zoukankan      html  css  js  c++  java
  • 关于EF Code First模式不同建模方式对建表产生的影响

    今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下:

    1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下:

        //User类
        class User
        {
            public Guid UserId { get; set; }
    
            public string Name { get; set; }
        }
    class CodeFirstContext:DbContext
        {
            public DbSet<User> Users { get; set; }
        
            public CodeFirstContext() : base("name=CodeFirstDemo"){}
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
            }
        }
    static void Main(string[] args)
            {
                using (var context = new CodeFirstContext())
                {
                    foreach (var item in context.Users)
                    {
                        Console.WriteLine(item.Name);
                    }
                    Console.ReadKey();
                }
            }

    运行控制台,看看数据库会有什么表现?

    结论:发现EF在我没有指定那个是主键的情况下,将UserId设为了主键

    2、当一个实体中有两个带Id的字段,EF会将最像Id的设为主键,优先级  Id>UserId>UserId_Id

    class User
        {
            public Guid Id { get; set; }
    
            public Guid UserId { get; set; }
    
            public string Name { get; set; }
        }

    其他代码相同,只改User类代码,运行控制台看数据库表现

    EF将Id设为了主键,UserId和UserId_Id的优先级自行验证.

    3、关于外键的问题,当在实体中加入导航属性,EF生成外键可能会当前实体中的其他字段的影响.验证代码如下:

        class PhotoInfo
        {
            public Guid Id { get; set; }
            public string PhootoContent { get; set; }
            public string IsActive { get; set; }
            public User User { get; set; }
    
        }
    
        //User类
        class User
        {
            public Guid Id { get; set; }
    
            public string Name { get; set; }
        }
        class CodeFirstContext:DbContext
        {
            public DbSet<User> Users { get; set; }
            public DbSet<PhotoInfo> PhotoInfos { get; set; }
    
            public CodeFirstContext() : base("name=CodeFirstDemo"){}
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
            }
        }
        static void Main(string[] args)
            {
                using (var context = new CodeFirstContext())
                {
                    foreach (var item in context.Users)
                    {
                        Console.WriteLine(item.Name);
                    }
                    foreach (var item in context.PhotoInfos)
                    {
                        Console.WriteLine(item.PhootoContent);
                    }
                    Console.ReadKey();
                }
            }

    看看数据库的表现:

    EF生成了一个User_Id的外键属性,关联User表

    下面修改PhotoInfo实体,代码如下:

        class PhotoInfo
        {
            public Guid Id { get; set; }
            public string PhootoContent { get; set; }
            public string IsActive { get; set; }
            public Guid UserId { get; set; }
            public User User { get; set; }
    
        }

    EF不再自动生成外键字段,而是将UserId属性设为了外键.

    以上都是我测试出来的关于EF默认的行为,比较片面,欢迎指正.

  • 相关阅读:
    Oracle-连接多个字段
    Oracle-like 多条件过滤
    SQL-Union、Union ALL合并两个或多个 SELECT 语句的结果集
    EXCEL-批量删除筛选出的行,并且保留首行
    EXCEL-REPLACE()替换字符串最后几位 删除字符串最后几位
    Oracle-常用表的查询、增加列、删除列、修改列值功能【增删改查】
    Excel-返回列表或数据库中的分类汇总(汇总可以实现要还是不要统计隐藏行功能) subtotal()
    Excel-统计各分数段人数 frequency()
    Excel-给出指定数值的日期 date()
    Class类的理解与获取Class的实例
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/7727780.html
Copyright © 2011-2022 走看看