簡體   English   中英

EF核心代碼優先:通常重命名擁有類型的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM