【问题标题】:Can Entity Framework be configured to load a collection property where there is no database relationship?可以将实体框架配置为在没有数据库关系的情况下加载集合属性吗?
【发布时间】:2016-03-11 15:06:00
【问题描述】:

如果我在 EF6 实体类上设置一个集合属性,我希望它包含一组来自数据库的参考数据,是否可以将 EF 配置为自动加载它,因为这两个数据库之间没有关系表?我以医生预约系统为例进行说明:

[Table]
public class Doctor 
{
    public Collection<Slot> AppointmentTimes { get; set; }
}

[Table]
public class Slot
{
    [Column]
    public DateTime StartTime { get; set; }

    [Column]
    public DateTime EndTime { get; set; }
}

每位医生的预约时间都相同。当前的解决方案是我认为 DbContext 中的一种 hacky 方法:

public Doctor FindDoctor(int id)
{
     var doctor = this.Doctors.Find(id);

     // I would rather have EF do this for me in the above Find() call
     if (doctor != null)
     {                
         foreach (var slot in this.Slots.ToList())
         {
            doctor.AppointmentTimes.Add(slot);
         }
     }

    return doctor;
}

【问题讨论】:

  • 当两个实体之间有明确的关系时,为什么不想声明它们之间的关系?
  • 这些实体在数据库中没有关系,因此在 EF 模型中给它们一个是不合适的。这种关系应该存在于应用程序的更高层中。
  • 好的,你有 Doctor & Slots,到目前为止一切顺利。这些是完全不相关的,您只能将它们作为单独的对象一起加载。您可以使用一个选择(交叉连接),但这对您没有多大帮助。我的问题是,您的模型是否完全成熟?你打算如何使用这些插槽?假设您想预约一名医生和一个空档,那么您就有了关系。我认为您需要在模型上进行更多工作并更好地发现实际关系。

标签: c# entity-framework


【解决方案1】:

当然可以。打开您的 EDMX,创建一个新关系(edmx 映射关系而不是 DB 关系)并保存。

我说的是 DB 优先方法

【讨论】:

    【解决方案2】:

    你在这里描述的是一个独立的关联是实体框架https://msdn.microsoft.com/en-gb/data/jj713564.aspx

    var doctor = context.Doctors.First(c=>c.Id == id); 
    context.Entry(doctor ).Reference(c => c.AppointmentTimes ).Load();
    

    【讨论】:

    • 感谢您的建议,但这些期望存在数据库关系,即它会因列名无效而出错。我知道没有直接关系有点奇怪,插槽总是相同的,我只是不想复制它们。我开始认为它们应该在其他地方定义,例如配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多