无法确定关联的主要端 - 实体框架模型优先

时间:2014-05-06 21:54:56

标签: c# entity-framework fluent-interface

我在Visual Studio中创建了实体数据模型。现在我有一个SQL查询和从Model。生成的C#类的文件。

问题:

生成的类没有注释或代码(Fluent API)。可以吗?我试图运行我的应用程序,但抛出了异常:

无法确定类型“Runnection.Models.Address”和“Runnection.Models.User”之间关联的主要结尾。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

我读到我不能将Fluent API与“Model First”一起使用。那我该怎么办?

代码:

用户

public partial class User
{
    public User()
    {
        this.Events = new HashSet<Event>();
        this.CreatedEvents = new HashSet<Event>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Photo { get; set; }
    public int EventId { get; set; }
    public string Nickname { get; set; }
    public OwnerType OwnerType { get; set; }
    public NetworkPlaceType PlaceType { get; set; }

    public virtual ICollection<Event> Events { get; set; }
    public virtual Address Address { get; set; }
    public virtual ICollection<Event> CreatedEvents { get; set; }
    public virtual Owner Owner { get; set; }
}

地址

public partial class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string StreetNumber { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }
}

上下文

// Model First不使用此方法

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Address>().HasRequired(address => address.User)
                                   .WithRequiredDependent();
        modelBuilder.Entity<User>().HasRequired(user => user.Address)
                                   .WithRequiredPrincipal();

        base.OnModelCreating(modelBuilder);
    }

2 个答案:

答案 0 :(得分:29)

您必须以一对一的关系指定委托人。

public partial class Address
{
    [Key, ForeignKey("User")]
    public int Id { get; set; }
    public string Street { get; set; }
    public string StreetNumber { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }
}

通过指定FK约束,EF知道用户必须先存在(主体),然后是地址。

Further reading at MSDN.

Also, see this SO answer.


从评论

更新

在设计器中,选择关联(用户和地址之间的行)。在属性窗口中,单击“参照约束”上的[...]按钮(或双击该行)。将Principal设置为User。


答案 1 :(得分:0)

错误: 有相同的错误&#34;无法确定类型之间关联的主要结尾&Providence.Common.Data.Batch&#39;和&#39; Providence.Common.Data.Batch&#39;。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。&#34;。

但是,请注意这是SAME表。

原因:我的数据库是MS SQL Server。不幸的是,当MS SQL Server的Management Studio添加外键时,它会将默认外键添加为Batch表的Batch ID列,链接回自身。您作为开发人员假设选择另一个表和id为真正的外键,但如果您失败,它仍然允许自引用FK的输入。

解决方案:   解决方法是删除默认的FK。

原因2:另一种情况是当前表可能是固定的,但是当EF的edmx完成时,表的旧历史图像具有默认的FK。

解决方案2:从模型浏览器的实体类型列表中删除该表,然后单击&#34;是&#34;然后&#34;从数据库更新模型&#34;试。