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

本文关键字:框架 模型 实体 关联 主体 无法确定 | 更新日期: 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:从模型浏览器的实体类型列表中删除表,点击"是",然后再次点击"从数据库中更新模型"。