【问题标题】:EF Core Code First: Generally rename properties of owned typesEF Core Code First:通常重命名拥有类型的属性
【发布时间】:2019-08-15 20:23:55
【问题描述】:

this documentation 之后,我正在尝试创建一些具有自有类型属性的实体:

[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 属性,尝试获取该拥有类型的所有实体,但这似乎不起作用。

有没有办法解决这个问题?

【问题讨论】:

    标签: c# ef-code-first entity-framework-core entity-framework-migrations owned-types


    【解决方案1】:

    于是我睡不着,又回去尝试,终于解决了:

    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);
                    });
                }
            }
        }
    

    如果您能指出一个更好、更清洁的解决方案(如果有的话),我仍然会很高兴。或者我的代码中可能存在一些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2014-01-20
      相关资源
      最近更新 更多