前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于EF Code First模式不同建模方式对建表产生的影响

关于EF Code First模式不同建模方式对建表产生的影响

作者头像
郑小超.
发布2018-01-26 16:28:53
9300
发布2018-01-26 16:28:53
举报
文章被收录于专栏:GreenLeavesGreenLeaves

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

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

代码语言:javascript
复制
    //User类
    class User
    {
        public Guid UserId { get; set; }

        public string Name { get; set; }
    }
代码语言:javascript
复制
class CodeFirstContext:DbContext
    {
        public DbSet<User> Users { get; set; }
    
        public CodeFirstContext() : base("name=CodeFirstDemo"){}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
代码语言:javascript
复制
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

代码语言:javascript
复制
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生成外键可能会当前实体中的其他字段的影响.验证代码如下:

代码语言:javascript
复制
    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; }
    }
代码语言:javascript
复制
    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);
        }
    }
代码语言:javascript
复制
    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实体,代码如下:

代码语言:javascript
复制
    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默认的行为,比较片面,欢迎指正.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档