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

  • 相关阅读:
    django中的自定义标签与过滤器,静态文件配置,orm前戏
    JavaScript(js)运算符
    JavaScript(js)字面量,函数写法
    JavaScript(js)的4中输出方式
    JavaScript(js)的学习使用样式,核心语法,数据类型
    标签链接、表单及css部分知识
    学习html5 附代码
    automationOperationsWithPython
    0821 1336 模块与包的导入方法、常用模块介绍
    0816 1459 json & pickle ,目录导入,目录规范
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/7727780.html
Copyright © 2011-2022 走看看