C# 如何仅使用单向导航对实体框架实体/映射进行建模
使用EF5,首先编码 我希望对实体进行建模,使导航属性只存在于关系的一侧 因此,如果我有一个表小部件和一个表WidgetType:C# 如何仅使用单向导航对实体框架实体/映射进行建模,c#,entity-framework,ef-code-first,entity-framework-5,navigation-properties,C#,Entity Framework,Ef Code First,Entity Framework 5,Navigation Properties,使用EF5,首先编码 我希望对实体进行建模,使导航属性只存在于关系的一侧 因此,如果我有一个表小部件和一个表WidgetType: public class Widget { public int Id { get; set; } public int WidgetTypeId { get; set; } public WidgetType WidgetType { get; set; } } public class WidgetType { public i
public class Widget
{
public int Id { get; set; }
public int WidgetTypeId { get; set; }
public WidgetType WidgetType { get; set; }
}
public class WidgetType
{
public int Id { get; set; }
//note there is no collection of Widgets here
}
public class WidgetMap : EntityTypeConfiguration<Widget>
{
public WidgetMap()
{
HasKey(t => t.Id);
//totable, etc.
HasRequired(t => t.WidgetType); //what else is needed?
}
}
公共类小部件
{
公共int Id{get;set;}
public int-widgetypeid{get;set;}
公共WidgetType WidgetType{get;set;}
}
公共类WidgetType
{
公共int Id{get;set;}
//注意这里没有小部件的集合
}
公共类WidgetMap:EntityTypeConfiguration
{
公共WidgetMap()
{
HasKey(t=>t.Id);
//易变的。
HasRequired(t=>t.WidgetType);//还需要什么?
}
}
我永远不想从widgetType的角度获取小部件,因此(无论如何对我来说)在widgetType实体上没有导航属性是有意义的
如何在不向WidgetType添加属性的情况下完成代码示例中记录的映射代码?这可能吗?根据评论中的要求,以下是我的答案 你应该试试:
HasRequired(t => t.WidgetType).WithRequired().HasForeignKey(t => t.FKField);
我知道有一个被接受的答案,但是上面的解决方案对我不起作用,我不得不对它进行一些调整 我使用的是EntityFramework6,也有类似的问题。我有一个名为BaseEntity的表,其中有一个CreatedByID字段,指向我的UserAccount表 这在我的UserAccount类中创建了BaseEntity类型的ICollection。我能够通过在我的BaseEntity映射中使用以下代码来解决此问题:
this.HasOptional(t => t.UserAccount)
.WithMany()
.HasForeignKey(t => t.CreatedByID);
然后,我能够从UserAccount类中删除BaseEntity集合,该类在EF6中创建了单向一对多映射
UserAccount条目是可选的,因为UserAccount继承自BaseEntity。如果这是模型中的一个必需属性,请确保使用HasRequired()。解决方案必须流畅吗?我强烈建议使用。我宁愿让属性双向运行,也不愿让它不流畅。好的,你试过
HasRequired(t=>t.widgetype).WithRequired()了吗代码>?我没有——我的想法是框架将无法知道外键是什么?我不需要以某种方式指定外键吗?哦,我现在明白了。然后我可以指定HasForeignKey(t=>t.xxxx)。让我试试。编辑以添加外键位。这似乎是可行的,尽管我有点担心EF会进行一些基于约定的映射,所以它基于约定工作并不是完全不可能的,实际上它忽略了这段代码。:)