C# 实体框架-具有挑战性的设置包括多个主键和与外部表的多个关联
我正在尝试使用实体框架映射两个遗留表。课程看起来像这样C# 实体框架-具有挑战性的设置包括多个主键和与外部表的多个关联,c#,.net,entity-framework,orm,ef-code-first,C#,.net,Entity Framework,Orm,Ef Code First,我正在尝试使用实体框架映射两个遗留表。课程看起来像这样 public class Customer { [Key, Required] public string Code { get; set; } public string Domain { get; set; } public virtual Address BillToAddress { get; set; } public virtual ICollection<Address>
public class Customer
{
[Key, Required]
public string Code { get; set; }
public string Domain { get; set; }
public virtual Address BillToAddress { get; set; }
public virtual ICollection<Address> ShipToAddresses { get; set; }
}
public class Address
{
[Column(Order = 0), Key, Required]
public string Code { get; set; }
[Column(Order = 1), Key, Required]
public string Domain { get; set; }
public string Type { get; set; }
public string CustomerReferenceCode { get; set; }
}
但是我还没有弄清楚如何为客户引用shiptoaddress
集合。请参见此示例(注意,它是单独的类):
一个简单的方法可能是:
public class Customer
{
[Key, Required]
public string Code { get; set; }
public string Domain { get; set; }
public virtual ICollection<Address> Addresses{ get; set; }
public virtual Address BillToAddress { get { Addresses.Where(n=>n.Type = Address.BillingAddress)).Single(); }
public virtual ICollection<Address> ShipToAddresses { get { Addresses.Where(n=>n.Type = Address.ShipToAddress)); }
}
公共类客户
{
[钥匙,必填]
公共字符串代码{get;set;}
公共字符串域{get;set;}
公共虚拟ICollection地址{get;set;}
公共虚拟地址BillToAddress{get{Addresses.Where(n=>n.Type=Address.BillingAddress)).Single();}
公共虚拟ICollection ShipToAddress{get{Addresses.Where(n=>n.Type=Address.ShipToAddress));}
}
另外一条评论——这并不是像您开始的示例那样隐式地强制执行您的单账单地址业务逻辑,因此您需要在上面的方法中的其他地方强制执行。此外,创建两个类并使用我链接到的示例中描述的TPH是我可能采用的方法——这将满足您的要求r直接描述了上述目标。此外,在两者之间,这可能会起作用,直接使用每个属性的getter中的鉴别器。请参见此示例(注意,它是单独的类):
一个简单的方法可能是:
public class Customer
{
[Key, Required]
public string Code { get; set; }
public string Domain { get; set; }
public virtual ICollection<Address> Addresses{ get; set; }
public virtual Address BillToAddress { get { Addresses.Where(n=>n.Type = Address.BillingAddress)).Single(); }
public virtual ICollection<Address> ShipToAddresses { get { Addresses.Where(n=>n.Type = Address.ShipToAddress)); }
}
公共类客户
{
[钥匙,必填]
公共字符串代码{get;set;}
公共字符串域{get;set;}
公共虚拟ICollection地址{get;set;}
公共虚拟地址BillToAddress{get{Addresses.Where(n=>n.Type=Address.BillingAddress)).Single();}
公共虚拟ICollection ShipToAddress{get{Addresses.Where(n=>n.Type=Address.ShipToAddress));}
}
另外一条评论——这并不是像您开始的示例那样隐式地强制执行您的单账单地址业务逻辑,因此您需要在上面的方法中的其他地方强制执行。此外,创建两个类并使用我链接到的示例中描述的TPH是我可能采用的方法——这将满足您的要求r直接描述了上述目标。此外,在两者之间,这可能会起作用,直接在每个属性的getter中使用鉴别器。这是一个相当直接的解决方案。我们确实对EF上下文的模型和查询进行了相当严格的分离。目前,我正在基础iqueryable t中实现一些非常类似的功能hat调用客户,我在那里填充各种地址。所以-这很有帮助?在这种情况下,很高兴我能提供帮助!这是一个相当直接的解决方案。我们对EF上下文对模型和查询进行了相当严格的分离。目前,我正在基iqueryable中实现一些非常类似的东西…调用custo梅尔,我正在填充那里的各种地址。所以-这很有帮助?在这种情况下,很高兴我能帮上忙!