[英]EF Core Code First: Generally rename properties of owned types
根据本文档 ,我尝试创建一些具有拥有类型的属性的实体:
[Owned]
public class StreetAddress
{
public string Street { get; set; }
public string City { get; set; }
}
public class Order
{
public int Id { get; set; }
public StreetAddress BillingAddress { get; set; }
public StreetAddress ShippingAddress { get; set; }
}
按照惯例,EF将在实体Order中创建以下属性:
BillingAddress_Street
BillingAddress_City
ShippingAddress_Street
ShippingAddress_City
我知道有一种方法可以重命名列:
modelBuilder.Entity<Order>().OwnsOne(
o => o.ShippingAddress,
sa =>
{
sa.Property(p => p.Street).HasColumnName("ShipsToStreet");
sa.Property(p => p.City).HasColumnName("ShipsToCity");
});
但是,这意味着我将需要将其用于将要生成的每个属性。 我认为,这正是我首先要避免使用拥有的类型的原因。
我想做的是创建一个自定义约定,但是,也许使用模型构建器并显式地告诉他如何命名这些属性,以消除下划线等。
我尝试深入研究modelBuilder属性,尝试获取该拥有类型的所有实体,但这似乎不起作用。
有办法解决吗?
因此我无法入睡,然后重新尝试,并能够解决该问题:
var ownedTypes = modelBuilder.Model.GetEntityTypes().Where(e => e.IsOwned());
foreach (var type in ownedTypes)
{
foreach (var prop in type.GetProperties())
{
var entityName = type.DefiningEntityType.Name;
var ownedType = type.ClrType;
var navigationName = type.DefiningNavigationName;
var propertyName = prop.Name;
var newColumnName = $"{navigationName}{propertyName}";
var primaryKeyName = modelBuilder.Model.GetEntityTypes().SingleOrDefault(e => e.Name == entityName)?.GetProperties().SingleOrDefault(p => p.IsPrimaryKey())?.Name;
if (string.IsNullOrWhiteSpace(primaryKeyName) || propertyName != primaryKeyName)
{
modelBuilder.Entity(entityName).OwnsOne(ownedType, navigationName, sa =>
{
sa.Property(propertyName).HasColumnName(newColumnName);
});
}
}
}
如果您能找到一个更好,更清洁的解决方案,我仍然很高兴。 也许我的代码中有一些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.