我不认为这是直接可能的。如果您映射某些内容,它将最终成为关系或列。因此,如果您希望您的客户看起来像:
public class Customer
{
...
public Address PrimaryAddress { get; set; }
public ICollection<Address> Addresses { get; set; }
}
最终会变成桌子:
CREATE TABLE dbo.Customers
(
...
PrimaryAddress_ID INT NULL
)
根据Address 实体定义,您可以将Addresses 映射为1:N(Customer_ID 在Addresses 表或M:N(联结表)关系中。
这不是很好,因为还应该有一些约束,PrimaryAddress_ID 必须来自与客户相关的地址。这种约束可能需要通过触发器进行检查。
除非您正在构建只读应用程序或准备定义 INSTEAD OF 触发器,否则查看也不可行。
不用映射也可以做到:
public class Customer
{
...
public ICollection<Address> Addresses { get; set; }
[NotMapped]
public Address PrimaryAddress
{
get
{
return Addresses.Single(a => a.IsPrimary);
}
// If you need set you can implement it in similar way
}
}
你也可以不带属性定义它,但你需要在OnModelCreating上使用Ignore:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.Ignore(c => c.PrimaryAddress);
}
该方法的缺点是它总是会加载所有地址。
如果您知道不需要其他主要地址,您可以使用:
context.Entry<Customer(customer)
.Collection(c => c.Addresses)
.Query()
.Where(a => a.IsPrimary)
.Load();
这将只加载主地址,但您必须先加载客户,因此您必须循环访问数据库。