【问题标题】:Creating one to many relationship in Entity Framework using Fluent API使用 Fluent API 在实体框架中创建一对多关系
【发布时间】:2015-08-12 15:13:08
【问题描述】:

我有以下 POCO 课程:

public class Client
{
    public string ClientId { get; set; }
    public string CompanyId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }

    [ForeignKey("AccountId")]
    public virtual ICollection<Note> Notes { get; set; } 
}

public class Note
{
    public decimal NoteId { get; set; } 
    public string AccountId { get; set; }
    public string NoteValue { get; set; }

    [ForeignKey("ClientId")]
    public virtual Client Client { get; set; }
}

以及以下映射类:

    public ClientMap(string schema)
    {
        ToTable("CLIENTS", schema);

        // Primary Key
        HasKey(t => t.ClientId);

        // Properties
        Property(t => t.ClientId)
            .HasColumnName("CLIENT_ID")
            .IsRequired()
            .HasMaxLength(16);

        Property(t => t.CompanyId)
            .HasColumnName("COMPANY_ID")
            .IsRequired()
            .HasMaxLength(16);

        Property(t => t.LastName)
            .HasColumnName("LAST_NAME")
            .IsRequired()
            .HasMaxLength(50);

        Property(t => t.FirstName)
            .HasColumnName("FIRST_NAME")
            .IsRequired()
            .HasMaxLength(50);
    }

    public NoteMap(string schema)
    {
        ToTable("NOTES", schema);

        // Primary Key
        HasKey(t => t.NoteId);

        // Properties
        Property(t => t.NoteId)
            .HasColumnName("NOTE_ID")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Property(t => t.AccountId)
            .HasColumnName("ACCOUNT_ID")
            .IsRequired()
            .HasMaxLength(16);

        Property(t => t.NoteValue)
            .HasColumnName("NOTE")
            .HasMaxLength(4000);
    }

在此模型中(使用 Fluent API),客户端和便笺之间存在一对多的关系。 ClientID 是客户端中的 PK,NoteId 是 Notes 中的 PK。数据库中没有外键。 ClientId 映射到 Notes 中的 AccountId

我无法让它工作。当我运行它时,我可以取回大部分客户端数据,但是在尝试导航到笔记时,我在尝试查看笔记时收到功能评估超时错误。我无法让客户和笔记之间的关系正常工作。我哪里出错了? (我想使用 Fluent API 来实现)

谢谢

【问题讨论】:

    标签: c# entity-framework ef-code-first ef-fluent-api


    【解决方案1】:

    您正在尝试创建典型的一对多关系。首先,删除您在模型中使用的数据注释,如果您打算使用 Fluent Api,则不需要它们。其次,在Note 实体中添加ClientId FK 属性

    public class Note
    {
        public decimal NoteId { get; set; } 
        public string AccountId { get; set; }
        public string NoteValue { get; set; }
    
        //FK property
        public int ClientId{get;set;}
    
        public virtual Client Client { get; set; }
    }
    

    然后,在 NoteMap 类的构造函数中,添加这个 Fluent Api 配置:

     HasRequired(n=>n.Client).WithMany(c=>c.Notes).HasForeignKey(n=>n.ClientId);
    

    【讨论】:

    • 进度,现在函数没有超时,但我没有收到任何注释。
    • 超时?您能否删除您的数据库(如果已经存在)并重试?
    • 当我使用注释时,它超时了。但是我忘了修复我之前所做的额外更改。我取回了完整的客户记录,但是在尝试导航到注释时,我收到了 CommandExecution 错误。它说 Oracle 没有重新识别 ClientId 是一个无效的标识符。所以在我看来,查询没有正确构建,因为客户端 ID 是正确的,而不是全部大写。
    • 但是在删除注释并添加我建议的流畅的api配置之后?您是否尝试过添加一些新数据?您是否检查过您的数据库架构是否已更改? “我可以取回完整的客户记录”是什么意思?
    • 显然您正在使用现有数据库,我认为您应该在 NoteMap 构造函数中添加此配置:Property(t =&gt; t.ClientId).HasColumnName("CLIENT_ID");// the FK column name in the Notes table
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多