C# 如何仅使用单向导航对实体框架实体/映射进行建模

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

使用EF5,首先编码

我希望对实体进行建模,使导航属性只存在于关系的一侧

因此,如果我有一个表小部件和一个表WidgetType:

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会进行一些基于约定的映射,所以它基于约定工作并不是完全不可能的,实际上它忽略了这段代码。:)