实际项目中会使用Data Annotations和Fluent API配置数据库吗? 感觉很麻烦呀.
没人搞过吗?
你在数据库编辑器里编辑要做的操作.是比写那几行代码要多的.
可能是你没有做一些优化的事情.
比如我用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 }); }); }
通过反射调用所有的配置对象
配置的时候, 什么hasMany 什么haskey 配置外键, 就很乱, 弄不好就出错,想不清就关系(一对多,多对多)就乱了, 这样子,我用的时候不配置 直接model开搞 有什么弊端吗? 连导航属性都没有
@liyanzhao: 用ef的前提是你对orm有深刻理解.
如果只是吧ef当作一个数据访问层的官方实现.那建议不要用.
还不如自己写一个数据访问层封装下dapper.比ef不知道好到哪里去.
orm的基本点就是:他是对象-关系-映射 不是 对象-表-映射
如果关系管理不好.理不清.那就别用orm了.推荐用我设计的数据访问层思路.
@吴瑞祥: 明白了, 公司现在就这样搞得, 很蛋疼。 谢谢老哥
个人看法吧~反正我不觉得麻烦,一直都是code first开发
还是比较简单的,多看看资料吧。