EF7 - HasOne关系自定义列名

6

如何在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。

2个回答

1
您可以使用 Data Annotations 来配置关系的外键。
public int AddressID { get; set; }

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

这需要一个在你的关系中用作外键的属性。此外,请注意,建议为你的关系具有显式外键而不是阴影外键。这将避免在插入/更新时出现许多问题,因为你不需要设置整个导航属性Address来保存House实体。请参见此处的问题。
未经测试,但也许这可以工作(现在找不到安装EF7的方法)。
modelBuilder.Entity<House>()
    .HasOne(x => x.Address)
    .WithOne()
    .OnDelete(DeleteBehavior.Cascade);
    .HasForeignKey(x => x.AddressID);

您可以在此处查看更多示例:EF7外键关系

我在EF7中没有看到.Map()方法。 - SkipHarris
1
你必须使用FluentAPI吗?我在这里尝试找到一种方法,猜想这在EF7中不起作用。 - jpgrassi
在EF7中,ForeignKey属性与.HasForeignKey()方法的组合似乎无法正常工作。 - SkipHarris
如果只使用属性会怎样?仅属性应该可以工作。 - jpgrassi

0

您可以从 modelBuilder.Entity<House>().Metadata.GetProperties() 列表中获取属性 first,然后设置其名称

property.Relational().ColumnName = "YouCustomId"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接