无法确定关联的主体端-实体框架模型优先
本文关键字:框架 模型 实体 关联 主体 无法确定 | 更新日期: 2023-09-27 18:01:56
我在Visual Studio中创建了实体数据模型。现在我有一个文件与SQL查询和c#类从模型生成。
问题:
类是在没有注释或代码的情况下生成的(Fluent API)。可以吗?我试图运行我的应用程序,但抛出异常:
无法确定类型Runnection.Models之间关联的主要结束。地址'和'Runnection.Models.User'。该关联的主体端必须使用关系流畅API或数据注释显式配置。
我读到我不能使用Fluent API与"模型第一"。那我该怎么办呢?
代码:
用户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; }
}
<<p> 地址/em> 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; }
}
<<p> 上下文/em> //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);
}
您必须在一对一关系中指定主体。
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知道User必须首先存在(主体),然后是Address。
在MSDN进一步阅读。
同样,请看这个SO的答案。
根据注释更新
在设计器中,选择Users &地址)。在属性窗口中,点击带有[…]]上的引用约束(或双击该行)。设置主体为用户
错误:有相同的错误"无法确定类型之间关联的主体端"。Batch'和'Providence.Common.Data.Batch'。这种关联的主体端必须使用关系流畅API或数据注释显式配置。
但是,请注意这是同一个表。
原因:我的数据库是MS SQL Server。不幸的是,当MS SQL Server的管理工作室添加外键时,它会添加默认的外键作为批处理表的批ID列链接回自己。作为开发人员,您应该选择另一个表和id作为真正的外键,但如果您失败了,它仍然允许进入自引用FK。
解决方案:处理方法是删除缺省的FK。
原因2:另一种情况是当前表可能是固定的,但是EF的edmx完成时表的旧历史映像具有默认FK。
解决方案2:从模型浏览器的实体类型列表中删除表,点击"是",然后再次点击"从数据库中更新模型"。