EF Core HasMany vs OwnsMany
EF Core HasMany vs OwnsMany
回答1
From documentation:
EF Core allows you to model entity types that can only ever appear on navigation properties of other entity types. These are called owned entity types. The entity containing an owned entity type is its owner.
Owned entities are essentially a part of the owner and cannot exist without it, they are conceptually similar to aggregates.
https://learn.microsoft.com/en-us/ef/core/modeling/owned-entities
回答2
One of the differences is that relationships configured with OwnsMany()
will include the owned entities by default when querying the owner from the database, whilst when using WithMany()
you have to specify AutoInclude()
manually if you want them to be included every time you get the owner entity form the database.
Also from documentation: Querying owned types
EF Core: Owned Entity Types
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<User> Users { get; set; }
//...
}
public class UserEntityConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.ToTable($"{nameof(User)}");
builder.OwnsOne(x => x.Address);
}
}
public class UserEntityConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.ToTable($"{nameof(User)}");
builder.OwnsOne(x => x.Address, y =>
{
y.Property(y => y.City)
.HasColumnName("City");
y.Property(y => y.Street)
.HasColumnName("Street");
});
}
}
using var context = new MyDbContext();
User user = new User
{
Name = "John Doe",
Address = new Address { Street = "Some Street1", City = "Some City1" }
};
await context.Users.AddAsync(user);
await context.SaveChangesAsync();
using var anotherContext = new OrderDbContext();
user = await anotherContext.Users.FirstOrDefaultAsync();
SELECT TOP(1) [u].[Id], [u].[Name], [u].[City], [u].[Street]
FROM [User] AS [u]
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Address> Addresses { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Type { get; set; }
}
public class UserEntityConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder.ToTable($"{nameof(User)}");
builder.OwnsMany(x => x.Addresses, y =>
{
y.ToTable("UserAddress");
y.Property(y => y.City)
.HasColumnName("City");
y.Property(y => y.Street)
.HasColumnName("Type");
y.Property(y => y.Street)
.HasColumnName("Type");
});
}
}
- You cannot create a DbSet<T> for an owned type.
- You cannot call Entity<T>() with an owned type on ModelBuilder.
- Instances of owned entity types cannot be shared by multiple owners (this is a well-known scenario for value objects that cannot be implemented using owned entity types).
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-11-15 高等数学 工专 柳重堪
2021-11-15 TortoiseGit not showing icon overlays Git图标消失
2021-11-15 Node.js: Python not found exception due to node-sass and node-gyp
2018-11-15 kentico检查当前授权用户,是否为admin角色
2016-11-15 signtool