实体框架 - 代码优先映射问题

时间:2013-01-11 08:21:11

标签: c# entity-framework ef-code-first

是否可以根据特定的列值进行外键映射。

我有以下实体。

public class Controller
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual List<ControllerDevice> ActiveDevices { get; set; }
    public virtual List<ControllerDevice> TamperedDevices { get; set; }
    public virtual List<ControllerDevice> IgnoredDevices { get; set; }
}

public class ControllerDevice
{
    public int Id { get; set; }
    public DeviceStatus Status { get; set; }

    public int ControllerId { get; set; }
    public int NetworkDeviceId { get; set; }

    public virtual Controller Controller { get; set; }
    public virtual NetowkDevice NetowkDevice { get; set; }
}

public class NetowkDevice
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
}

public enum DeviceStatus
{
    Active,
    Tampered,
    Ignored
}

是否可以根据ActiveDevices TamperedDevices自动填充IngoredDevicesControllerDeviceDeviceStatus列表,或者我是否必须创建三个每个列表的不同表。 IE ActiveControllerDeviceTamperedControllerDevicesIgnoredControllerDevices

如果您需要进一步说明,请与我们联系。

3 个答案:

答案 0 :(得分:0)

使用单个设备集合:

public class Controller
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual List<ControllerDevice> Devices { get; set; }
}

...并在需要处理或显示具有特定Status值的设备时对其进行过滤:

controller.Devices.Where(d => d.Status == DeviceStatus.Active);

每个设备状态和/或设备层次结构的几个表(理论上,您可以使用TPH继承来解决此问题)是一种地狱的方式,因为而不是具有状态的单个实体ControllerDevice获得三种实体类型(ActiveControllerDeviceTamperedControllerDeviceIgnoredControllerDevice),这与模型不对应。

设备不会更改状态,而是更改其类型,而您无法以简单的方式执行此操作。

答案 1 :(得分:0)

是的,你可以这样做。 Enum支持在实体框架5,.Net Framework 4.5中引入。在Entity Framework中,枚举可以具有以下基础类型:Byte,Int16,Int32,Int64或SByte。

你可以像这样过滤:

context.ControllerDevices.Where(d => d.Status == DeviceStatus.Active);

更多信息:http://msdn.microsoft.com/en-us/data/hh859576.aspx

答案 2 :(得分:0)

public class TestContext : DbContext
{
   public TestContext()
   {
      Configuration.AutoDetectChangesEnabled = true;
      Configuration.LazyLoadingEnabled = true;
      Configuration.ProxyCreationEnabled = true;
      Configuration.ValidateOnSaveEnabled = true;
   }

   public virtual DbSet<NetowkDevice> NetowkDevices{ get; set; }
   public virtual DbSet<ControllerDevice> ControllerDevices{ get; set; }
   public virtual DbSet<Controller> Controlleres{ get; set; }
}

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d0443029-2175-4bde-a834-4f8dbf313201/

Should I enable or disable dynamic proxies with entity framework 4.1 and MVC3?