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

  • 相关阅读:
    Thread之六:线程创建方法
    MySQL优化技巧之四(数据库设计中的一些技巧)
    数据库设计三大范式
    分布式事务之:TCC (Try-Confirm-Cancel) 模式
    spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller
    Thread之五:线程的优先级
    分布式事务之:TCC几个框架的测试情况记录
    spring AOP 之四:@AspectJ切入点标识符语法详解
    IP地址漂移的实现与原理
    高可用集群heartbeat全攻略
  • 原文地址:https://www.cnblogs.com/GreenLeaves/p/7727780.html
Copyright © 2011-2022 走看看