如何设置下面的导航属性?

时间:2015-03-11 10:41:03

标签: c# entity-framework

我是“实体框架”的新手,我有以下问题。 假设我有以下两个实体

public class Action
{
    public int Id {get;set;}
    public string ActionCode {get;set;}

    //navigation property
    public virtual DescriptionMaster ActionCodeDescription {get;set;}
}

public class DescriptionMaster
{
    public int Id {get;set;}
    public string Type {get;set;}
    public string Code {get;set;}
    public string Description {get;set;}
}

现在你可能会注意到我在“Action”类中有一个名为“ActionCodeDescription”的导航属性,两个实体(Action和DescriptionMaster)具有一对一的关系。
但是,对于“ActionCodeDescritption”属性,我没有任何外键列,而应该是符合以下条件的列。

DescriptionMaster.Type=="Action" and  DescriptionMaster.Code==Action.ActionCode

是否可以根据特定条件加载导航属性而不是使用任何外键? 我知道,我可能会做类似下面的事情,但如果可能的话,我只是想通过在某种程度上在“ActionCodeDescription”上设置“数据注释”来实现它。

    Action _action= dbContext.Actions.FirstOrDefault(a=>a.Id==1);
    _action.ActionCodeDescription=dbContext.DescriptionMasters.FirstOrDefault(x=>x.Type=="Action" && x.Code==_action.ActionCode);

3 个答案:

答案 0 :(得分:0)

来自'编程实体框架dbContext"第35页: 仅加载集合导航属性的内容子集的能力是一种常见请求,但EF目前不支持。

不是通过急切加载而不是通过延迟加载。 通过显式加载,它就是您已经知道的变体,就像您提出的最后一个代码片段一样。

然而你可能想读这个: https://msdn.microsoft.com/en-us/data/jj574232#explicitFilter

使用投影当然可以只加载导航属性中相关数据的子集。

答案 1 :(得分:0)

如何使用复合键?

public class Action
{
    public int Id { get; set; }

    //Foreign composite key values
    [ForeignKey("DescriptionMaster"), Column(Order = 0)]
    public string Code { get; set; }

    [ForeignKey("DescriptionMaster"), Column(Order = 1)]
    public string Type { get; set; }

    //navigation property
    public virtual DescriptionMaster ActionCodeDescription { get; set; }
}

public class DescriptionMaster
{
    // - get rid of integer Id : public int Id { get; set; }

    [Key, Column(Order = 0)]
    public string Code { get; set; }

    [Key, Column(Order = 1)]
    public string Type { get; set; }

    public string Description { get; set; }
}

答案 2 :(得分:0)

数据库关系(外键)与表内的值无关。因为没有外键支持任何数据库的任何条件。

实施例,

Category
   CategoryID (Primary Key)
   CategoryName

Product
   ProductID (Primary Key)
   ProductName
   ProductCategoryID (FK to Category.CategoryID)

ProductCategoryID对于所有可能的值都是FK,例如join,您不能在此指定任何条件。

但是,在您的情况下,您可以使用一对一*关系继承。

public class DescriptionMaster{
    [PrimaryKey]
    public int Id {get;set;}
    public string Type {get;set;}
}

public class ActionDescriptionMaster{
    [PrimaryKey]
    public int Id {get;set;} (FK to DescrptionMaster.Id)

    public int Code {get;set;}
    public string Description {get;set;}
}

public class Action{
    public int Id;

    [ForeignKey("ActionDescrptionMasterId")]
    public ActionDescrptionMaster {get;set;}
}

在Entity Framework中,ActionDescrptionMaster是DescriptionMaster的派生表,其中,仅当DescriptionMaster具有Type =" ActionCode"的值时,ActionDescrptionMaster值才存在。 DescriptionMaster和ActionDescriptionMaster之间的关系为零或一对一。

示例值

DescriptionMaster
Id      |    Type      |
4       |    None      |
5       |    Action    |
6       |    Action    |

ActionDescriptionMaster
Id      |    Code      |  Description   |
5       |       54     |  Stop          |
6       |       45     |  Proceed       |

Action
Id      |    ActionDescriptionId  |
1       |       6                 |  
2       |       5                 |  

请注意,ActionDescriptionMaster的值仅存在于5和6.此外,Action表没有任何代码,您可以将引用完整性设置为仅一个主键。

既然我的知识有限,我建议一个明确的方法,如果我知道你想要存储的原因和要求的正确要求,我可以建议更好的设计。