首页 新闻 会员 周边

EF code first 疑问

0
[已解决问题] 解决于 2018-09-06 14:45

实际项目中会使用Data Annotations和Fluent API配置数据库吗? 感觉很麻烦呀.

问题补充:

没人搞过吗?

liyanzhao的主页 liyanzhao | 初学一级 | 园豆:42
提问于:2018-07-19 00:21
< >
分享
最佳答案
1

你在数据库编辑器里编辑要做的操作.是比写那几行代码要多的.

可能是你没有做一些优化的事情.

比如我用Fluent API 配置关系.

方法是:每一个实体文件中包含2个类.一个实体类.一个配置类.配置类继承自 IEntityTypeConfiguration 泛型

    /// <summary>
    /// 系统sku信息
    /// </summary>
    public class SkuInfo : BaseModel
    {
        /// <summary>
        /// SKU编码
        /// </summary>
        public string Code { get; set; }

        /// <summary> 关键字 </summary>
        public string Keyword { get; set; }

        /// <summary> 所属SPUID </summary>
        public long SpuId { get; set; }

        /// <summary> 所属SPU </summary>
        public virtual SpuInfo Spu { get; set; }

        /// <summary>对应规格ID</summary>
        public long SpuSpecificationId { get; set; }
        /// <summary>对应的规格</summary>
        public virtual SpuSpecification SpuSpecification { get; set; }

        /// <summary>对应颜色ID</summary>
        public long SpuColorId { get; set; }
        /// <summary>对应的颜色id</summary>
        public virtual SpuColor SpuColor { get; set; }

        /// <summary>对应的分销sku</summary>
        public virtual List<DistributorSku> DistributorSkus { get; set; }
    }
    public class SkuInfoConfig : IEntityTypeConfiguration<SkuInfo>
    {
        public void Configure(EntityTypeBuilder<SkuInfo> builder)
        {
            builder.HasKey(a => a.Id);
            builder.Property(m => m.Id)
                .ValueGeneratedOnAdd();
            builder.Property(m => m.ConcurrencyToken)
                .IsConcurrencyToken();

            builder.HasOne(a => a.SpuColor)
                .WithMany(a => a.Skus)
                .HasForeignKey(a => a.SpuColorId);
            builder.HasOne(a => a.SpuSpecification)
                .WithMany(a => a.Skus)
                .HasForeignKey(a => a.SpuSpecificationId);
            builder.HasOne(a => a.Spu)
                .WithMany(a => a.Skus)
                .HasForeignKey(a => a.SpuId);

            builder.Property(a => a.Code).HasMaxLength(128);
            builder.Property(a => a.Keyword).HasMaxLength(128);
        }
    }

然后在上下文中

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            var mi = builder.GetType().GetMethod("ApplyConfiguration");
            var asm = Assembly.GetAssembly(this.GetType());
            asm.GetTypes()
                .Where(a => a.GetInterfaces().Any(i => i.FullName.Contains("Microsoft.EntityFrameworkCore.IEntityTypeConfiguration")))
                .Select(a =>
                {
                    return new { t = a.GetInterfaces().First().GenericTypeArguments.First(), o = asm.CreateInstance(a.FullName) };
                })
                .ToList().ForEach(a =>
                {
                    mi.MakeGenericMethod(a.t).Invoke(builder, new[] { a.o });
                });
        }

通过反射调用所有的配置对象

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2018-07-19 11:55

配置的时候, 什么hasMany 什么haskey  配置外键, 就很乱, 弄不好就出错,想不清就关系(一对多,多对多)就乱了, 这样子,我用的时候不配置 直接model开搞 有什么弊端吗? 连导航属性都没有

liyanzhao | 园豆:42 (初学一级) | 2018-07-19 12:07

@liyanzhao: 用ef的前提是你对orm有深刻理解.

如果只是吧ef当作一个数据访问层的官方实现.那建议不要用.

还不如自己写一个数据访问层封装下dapper.比ef不知道好到哪里去.

orm的基本点就是:他是对象-关系-映射  不是 对象-表-映射 

如果关系管理不好.理不清.那就别用orm了.推荐用我设计的数据访问层思路.

吴瑞祥 | 园豆:29449 (高人七级) | 2018-07-19 12:35

@吴瑞祥: 明白了, 公司现在就这样搞得, 很蛋疼。 谢谢老哥

liyanzhao | 园豆:42 (初学一级) | 2018-07-19 12:49
其他回答(2)
0

个人看法吧~反正我不觉得麻烦,一直都是code first开发

远扬 | 园豆:30 (初学一级) | 2018-07-19 10:37
0

  还是比较简单的,多看看资料吧。

温情亿度开发者 | 园豆:315 (菜鸟二级) | 2018-07-19 15:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册