【问题标题】:Entity Framework Code First one to many optional with fluent mapping实体框架代码第一个一对多可选,带有流畅的映射
【发布时间】:2014-06-29 04:50:33
【问题描述】:

我有以下 C# 模型,其中一家公司存在于给定的时区。

[Table("Company")]
public class Company
{
    [Key]
    public int Id { get; set; }

    [StringLength(255)]
    [Required]
    public string Name { get; set; }

    [Required]
    public TimeZone TimeZone { get; set; }

}

[Table("TimeZone")]
public class TimeZone
{
    [Key]
    public int Id { get; set; }

    [StringLength(255)]
    public string Name { get; set; }

}

在我预先存在的 SQL 数据库中,TimeZone 表是一个查找表,旨在供 company 表和其他任何需要 TimeZone 的对象引用。因此,一对多关系中的外键在公司中。

CREATE TABLE [dbo].[Company](
[Id]            [int] IDENTITY(1,1)     NOT NULL,
[Name]          [nvarchar](500)         NOT NULL,
[TimeZoneId]    [int]                   NOT NULL REFERENCES dbo.TimeZone(Id)) 

CREATE TABLE [dbo].TimeZone(
[Id]            [int] IDENTITY(1,1)     NOT NULL,
[Name]          [nvarchar](500)         NOT NULL)

如何使用 EF Fluent API(我使用 EF 6)映射他,以便我可以使用 Company.TimeZone.Name ?

【问题讨论】:

  • 你在使用流畅的 API 吗?看起来像数据注释。
  • 我两者都用。我认为 EF 允许我这样做……
  • 是的,确实如此。只需检查以确保您得到您期望的答案。 :)

标签: c# entity-framework


【解决方案1】:

试试这样的:

public class CompanyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Company>()
            .HasRequired(c => c.TimeZone)
            .WithMany()
            .HasForeignKey(c => c.TimeZoneId);

        base.OnModelCreating(builder);
    }

}

[Table("Company")]
public class Company
{
    [Key]
    public int Id { get; set; }

    public int TimeZoneId { get; set; }

    [StringLength(255)]
    [Required]
    public string Name { get; set; }

    // this will be navigation property
    public TimeZone TimeZone { get; set; }

}

[Table("TimeZone")]
public class TimeZone
{
    [Key]
    public int Id { get; set; }

    [StringLength(255)]
    public string Name { get; set; }

}

【讨论】:

  • 感谢@AppDeveloper - 有什么办法可以避免 Company 类型的 TimeZoneId 属性?
【解决方案2】:

您需要将 TimeZone 属性声明为虚拟以进行延迟加载,如下所示:

[Table("Company")]
public class Company
{
    [Key]
    public int Id { get; set; }

    [StringLength(255)]
    [Required]
    public string Name { get; set; }

    [Required]
    public virtual TimeZone TimeZone { get; set; }

}

[Table("TimeZone")]
public class TimeZone
{
    [Key]
    public int Id { get; set; }

    [StringLength(255)]
    public string Name { get; set; }

}

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多