1 modelBuilder.Entity<Product>() 2 .HasOne(e => e.Details).WithOne(e => e.Product) 3 .HasForeignKey<ProductDetails>(e => e.Id); ); );
七.Owned types
一个owned实体类型可以与另一个owned实体类型共享相同的CLR类型。但是由于它不能被CLR类型识别,所以必须从另一个实体类型导航到它。包含定义导航的实体是所有者。当查询所有者时,默认将包含所属的类型。
按照惯例,将为所属类型创建一个影子主键,它将通过使用表拆分映射到与所有者相同的表。
示例代码:
1 modelBuilder.Entity<Order>().OwnsOne(p => p.OrderDetails, cb => 2 { 3 cb.OwnsOne(c => c.BillingAddress); 4 cb.OwnsOne(c => c.ShippingAddress); 5 }); Order 8 { Id { get; set; } 10 public OrderDetails OrderDetails { get; set; } 11 } OrderDetails 14 { 15 public StreetAddress BillingAddress { get; set; } 16 public StreetAddress ShippingAddress { get; set; } 17 } StreetAddress 20 { Street { get; set; } City { get; set; } 23 }
八.函数映射
EF支持映射数据库中定义的函数,可以在LINQ查询中使用。
需要在 DbContext 中定义一个静态方法,并且使用 DbFunctionAttribute 特性。
示例代码:
BloggingContext : DbContext 2 { 3 [DbFunction] PostReadCount(int blogId) 5 { Exception(); 7 } 8 }
这样的方法是自动注册。一旦注册了方法,您就可以在查询的任何地方使用它。
要注意的几件事:
九.code first 实体配置在EF6可以通过 EntityTypeConfiguraiton 封装特定实体类型的配置代码,在EF Core2.0中,这个特性回来了(EF Core 之前的 core版本不支持)。
示例代码:
1 class CustomerConfiguration : IEntityTypeConfiguration<Customer> 2 { Configure(EntityTypeBuilder<Customer> builder) 4 { 5 builder.HasKey(c => c.AlternateKey); 6 builder.Property(c => c.Name).HasMaxLength(200); 7 } 8 } 9 10 ... builder.ApplyConfiguration(new CustomerConfiguration());
十.Pluralization hook for DbContext Scaffolding
EF Core 2.0 introduces a new IPluralizer service that is used to singularize entity type names and pluralize DbSet names. The default implementation is a no-op, so this is just a hook where folks can easily plug in their own pluralizer.
Here is what it looks like for a developer to hook in their own pluralizer:
MyDesignTimeServices : IDesignTimeServices 2 { ConfigureDesignTimeServices(IServiceCollection services) 4 { 5 services.AddSingleton<IPluralizer, MyPluralizer>(); 6 } 7 } MyPluralizer : IPluralizer 10 { Pluralize(string name) 12 { 13 return Inflector.Inflector.Pluralize(name) ?? name; 14 } Singularize(string name) 17 { 18 return Inflector.Inflector.Singularize(name) ?? name; 19 } 20 }
本人英语水平有限,如有翻译不对的地方,欢迎批评指正。
如果你觉得写的不错,请点一下的“推荐”,这是对我分享技术经验的支持,谢谢!
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!