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默认的行为,比较片面,欢迎指正.

  • 相关阅读:
    Vue的响应式和双向绑定的实现
    JS-跨域请求豆瓣API提供的数据
    豆瓣电影API接口
    JS/PHP-表单文件域上传文件和PHP后台处理
    jQuery-attr,prop及自定义属性
    PHP-关于php代码和html,js混编
    JS-Chrome控制台console.log会访问即时数据
    JS-time和timeEnd
    JS-用ID值直接操作DOM
    CSS-07 行内设置点击事件
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/7727780.html
Copyright © 2011-2022 走看看