无法确定关联的主要结束 – entity framework模型优先

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

题:

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

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

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

码:

用户

public partial class User { public User() { this.Events = new HashSet(); this.CreatedEvents = new HashSet(); } 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 Events { get; set; } public virtual Address Address { get; set; } public virtual ICollection 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
().HasRequired(address => address.User) .WithRequiredDependent(); modelBuilder.Entity().HasRequired(user => user.Address) .WithRequiredPrincipal(); base.OnModelCreating(modelBuilder); }

您必须以一对一的关系指定主体。

 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知道用户必须首先存在(主体)并且地址跟随。

进一步阅读MSDN。

另外,请看这个SO答案。

从评论更新


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


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

但是,请注意这是SAME表。

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

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

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

解决方案2:从模型浏览器的实体类型列表中删除该表,然后单击“是”,然后再次“从数据库更新模型”。