我是“实体框架”的新手,我有以下问题。 假设我有以下两个实体
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);
答案 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表没有任何代码,您可以将引用完整性设置为仅一个主键。
既然我的知识有限,我建议一个明确的方法,如果我知道你想要存储的原因和要求的正确要求,我可以建议更好的设计。