我被要求修改现有的应用程序,该应用程序从前端显示的业务层返回EF实体对象。在一些位置,有一些记录将OfficeCode作为字符串记录在数据库中。我在前端已被要求现在显示其中一些记录的OfficeName。以下是这些模型的片段。
public class Office
{
[Key]
public string OfficeCode { get; set; }
public string OfficeName { get; set; }
// Many more properties
}
public class Note
{
[Key]
public int Id { get; set; }
public string OfficeCode { get; set; } // Not a ForeignKey, I didn't create the database
public string OfficeName { get; set; } // Can we pull this from the Office table?
}
我以为我可以使用Entity Splitting但是我收到了错误消息
实体类型' Office'和#39;注意'不能分享桌子' Office'因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,并且它们之间具有匹配的主键。
如果表之间没有ForeignKey关系,是否有办法从另一个表填充属性?
有人可以想到一种优雅的方式来在Notes中显示OfficeName而不需要重新填充堆栈。
答案 0 :(得分:0)
您可以使用EF的Interceptors概念。 IDbCommandInterceptor允许您在执行之前修改SQL语句,并在执行后修改结果。
您必须将参数(OfficeCode)传递给Interceptor,然后手动修改sql查询(....从Office Where Note.OfficeCode = Office.OfficeCode)
我不知道,为什么你要让你的生活如此艰难,你注意到EF不喜欢你的数据定义,也许你看看使用复杂类型,或者TPH和两个实体共享相同的基础专栏,这将更容易。