【问题标题】:EF7 - Custom column name for HasOne relationshipEF7 - HasOne 关系的自定义列名称
【发布时间】:2017-09-19 17:01:42
【问题描述】:

如何在 EF7 中指定具有 HasOne 关系的自定义列名?

考虑以下示例类:

public class House
{
    public int Id { get; set; }
    public int BedroomCount { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string StreetName { get; set; }
    public string StreetNumber { get; set; }
}

还有这个流畅的配置:

modelBuilder.Entity<House>()
    .HasOne(x => x.Address)
    .WithOne()
    .OnDelete(DeleteBehavior.Cascade);

导致此数据库配置的原因:

CREATE TABLE [House] (
[Id] int NOT NULL IDENTITY,
[AddressId] int,
[BedroomCount] int NOT NULL,
CONSTRAINT [PK_House] PRIMARY KEY ([Id]),
CONSTRAINT [FK_House_Address_AddressId] FOREIGN KEY ([AddressId]) REFERENCES [Address] ([Id]) ON DELETE CASCADE);

CREATE TABLE [Address] (
[Id] int NOT NULL IDENTITY,
[StreetName] nvarchar(max),
[StreetNumber] nvarchar(max),
CONSTRAINT [PK_Address] PRIMARY KEY ([Id]));

如何在 House 表上指定“AddressId”以外的列名?我在非导航属性上找不到类似于 HasColumnName 的方法。

我正在使用 Entity Framework 7 RC1-Final。

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    您可以使用Data Annotations 来配置您的关系的外键。

    public int AddressID { get; set; }
    
    [ForeignKey("AddressID")]
    public Address Address { get; set; }
    

    这需要一个在您的关系中用作外键的属性。另外,请注意,建议您为关系使用显式外键,而不是影子外键。这将防止您在插入/更新时遇到很多问题,因为您不需要设置整个导航属性Address 来保存House 实体。看到问题here

    未经测试,但也许这可以工作(现在找不到安装 EF7 的方法)

    modelBuilder.Entity<House>()
        .HasOne(x => x.Address)
        .WithOne()
        .OnDelete(DeleteBehavior.Cascade);
        .HasForeignKey(x => x.AddressID);
    

    您可以在此处查看更多示例:Foreign Key Relationships EF7

    【讨论】:

    • 我在 EF7 中没有看到 .Map() 方法。
    • 一定要使用 FluentAPI 吗?我正在尝试在这里找到一种方法,猜想这不适用于 EF7
    • ForeignKey 属性与 .HasForeignKey() 方法的组合在 EF7 中似乎不起作用。
    • 如果只使用属性呢?单独的属性应该可以工作。
    【解决方案2】:

    您可以先从modelBuilder.Entity&lt;House&gt;().Metadata.GetProperties() 列表中获取属性,然后设置其名称

    property.Relational().ColumnName = "YouCustomId"
    

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      相关资源
      最近更新 更多