C# 无法首先确定关联实体框架模型的主体端

C# 无法首先确定关联实体框架模型的主体端,c#,entity-framework,fluent-interface,C#,Entity Framework,Fluent Interface,我已经在VisualStudio中创建了实体数据模型。现在我有了一个包含SQL查询和从模型生成的C类的文件 问题: 类是在fluentapi后面生成的,没有注释或代码。可以吗?我试图运行我的应用程序,但引发了异常: 无法确定类型“Runnection.Models.Address”和“Runnection.Models.User”之间关联的主体端。必须使用关系fluent API或数据注释显式配置此关联的主体端 我读到我不能先用Fluent API和模型。那我该怎么办 代码: 使用者 上下文 /

我已经在VisualStudio中创建了实体数据模型。现在我有了一个包含SQL查询和从模型生成的C类的文件

问题:

类是在fluentapi后面生成的,没有注释或代码。可以吗?我试图运行我的应用程序,但引发了异常:

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

我读到我不能先用Fluent API和模型。那我该怎么办

代码:

使用者

上下文

//Model First不使用此方法


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

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知道用户必须首先存在主体,地址随后存在

根据评论更新 在设计器中,选择用户和地址之间的关联行。在“属性”窗口中,单击带有[…]On Referential约束的按钮或双击该行。将主体设置为用户

错误: 具有相同的错误,即无法确定类型“Providence.Common.Data.Batch”和“Providence.Common.Data.Batch”之间关联的主端。必须使用关系fluent API或数据批注显式配置此关联的主体端

但是,请注意,这是同一个表

原因:我的数据库是MS SQL Server。不幸的是,当MS SQL Server的Management Studio添加外键时,它会将默认外键作为批处理表的批处理ID列添加回自身。作为开发人员,您应该选择另一个表和id作为真正的外键,但若您未能选择,它仍将允许输入自引用FK

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

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


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

实体框架不喜欢1-1关系。我知道这是一个解决办法,但这只是一个建议。我不明白为什么1-1不可能先用模型。您可以在OnModelCreating中看到,我可以在使用Code-First的情况下定义1-1。数据库表是从模型生成的,并且有指定的外键,为什么我要在类中再次指定它。我认为它将从我的模型生成。我必须在模型和代码中定义关联两次。这个问题不是先定义代码吗?是的,我知道这是一个选项。但代码是从模型自动生成的。若模型将被更改,我必须再次指定类的注释。好的,答案已更新。只需双击实体之间的行,并在打开的窗口中设置主体。谢谢,但这没有帮助,因为引用约束已定义:。很抱歉,我无法提供进一步的帮助。希望其他人能帮助回答这个问题。同时,您可能需要尝试0..1映射。您可能还想考虑一个像这样的自己的DAPP.NET的MyRoRM。输入多一点,但不易预测的行为和更好的性能。通过指定FK约束,EF知道用户必须首先存在,主体和地址紧随其后。谢谢谢谢谢谢!!
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; }
}
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; }
}