我正在将现有的 EF 模型转换为首先使用代码。
它有许多复杂类型,具有特定的数据库字段命名约定:
<propertyName>_<complexTypeName>_<complexTypeProperty>
例如,这个复杂类型:
public class ContactDetails {
public string Address1 {get;set;}
public string City {get;set;}
// ...etc
}
在此实体中使用:
public class Customer {
public int ID {get;set;}
public string Name {get;set;}
public ContactDetails BillingAddress {get;set;}
public ContactDetails DeliveryAddress {get;set;}
}
它出现在这样的数据库表中:
CREATE TABLE dbo.Customers (
ID INT NOT NULL,
Name NVARCHAR(30),
BillingAddress_ContactDetails_Address1 NVARCHAR(100),
BillingAddress_ContactDetails_City NVARCHAR(100),
DeliveryAddress_ContactDetails_Address1 NVARCHAR(100),
DeliveryAddress_ContactDetails_City NVARCHAR(100)
)
所以我需要更改复杂类型的默认命名约定。我可以像这样使用 Fluent 手动更新每个列名:
modelBuilder.Entity<Customer>().Property(x => x.BillingAddress.Address1).HasColumnName("BillingAddress_ContactDetails_Address1");
modelBuilder.Entity<Customer>().Property(x => x.BillingAddress.City).HasColumnName("BillingAddress_ContactDetails_City");
modelBuilder.Entity<Customer>().Property(x => x.DeliveryAddress.Address1).HasColumnName("DeliveryAddress_ContactDetails_Address1");
modelBuilder.Entity<Customer>().Property(x => x.DeliveryAddress.City).HasColumnName("DeliveryAddress_ContactDetails_City");
问题是它ContactDetails
在整个数据库中的许多不同表中多次使用。所以我想一次性配置它们。我需要这样的东西:
modelBuilder.ComplexType<ContactDetails>().Property(x => x.Address1).HasColumnName($"{???}_{???}_Address1");
modelBuilder.ComplexType<ContactDetails>().Property(x => x.City).HasColumnName($"{???}_{???}_City");
但是如何填写这些{???}
部分?在这种情况下,我可以从哪里获取属性名称和类型名称?