复杂类型是EF Core中用于建模值对象的机制,通过OwnsOne将无主键的类如Address嵌入实体如Order中,默认展平到主表;使用OwnsMany可支持一对多值对象集合,但会创建独立表并外键关联,适用于需结构化存储且无独立标识的场景。
在C#中使用EF Core的复杂类型(Owned Types)是一种将值对象建模为实体一部分的有效方式。它允许你将一个类作为另一个实体的组成部分,而不需要独立的数据库表。
复杂类型是EF Core中用于表示“拥有”关系的一种机制。它通常用于表示没有独立标识(即无主键)的值对象。例如,一个Address
类可以作为Order
或Person
的一部分存在,不单独存在表中。
要定义一个复杂类型,首先创建一个普通的C#类,然后通过配置告诉EF Core该类是“被拥有的”。
示例:定义Address类作为复杂类型
public class Address { public string Street { get; set; } public string City { get; set; } public string PostalCode { get; set; } public string Country { get; set; } }
public class Order { public int Id { get; set; } public string OrderNumber { get; set; } // 这个属性将被映射为复杂类型 public Address ShippingAddress { get; set; } }
使用OnModelCreating
方法中的OwnsOne
来配置复杂类型。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Order>() .OwnsOne(o => o.ShippingAddress, sa => { sa.Property(a => a.Street).HasColumnName("Shipping_Street"); sa.Property(a => a.City).HasColumnName("Shipping_City"); sa.Property(a => a.PostalCode).HasColumnName("Shipping_PostalCode"); sa.Property(a => a.Country).HasColumnName("Shipping_Country"); }); }
说明:
OwnsOne
表示该实体拥有一个复杂类型的实例。如果你需要一个实体拥有多个复杂类型实例(例如订单有多个收货地址),可以使用OwnsMany
。
public class Customer { public int Id { get; set; } public string Name { get; set; } public List<Address> Addresses { get; set; } = new List<Address>(); }
modelBuilder.Entity<Customer>() .OwnsMany(c => c.Addresses, a => { a.Property(addr => addr.Street).HasColumnName("Street"); a.Property(addr => addr.City).HasColumnName("City"); // 注意:OwnsMany会在单独的表中存储这些数据 });
注意: OwnsMany
虽然也是复杂类型,但EF Core会为其创建单独的表,并通过外键关联,因为它无法展平到单行中。
context.Set<address>()</address>
)。基本上就这些。只要合理使用OwnsOne
和OwnsMany
,就能很好地建模领域中的值对象,让数据库结构更清晰。
以上就是C#中如何使用EF Core的复杂类型?如何定义?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号