2016-01-14 37 views
1

如何在EF7中指定具有HasOne關係的自定義列名稱?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 House桌子上的「AddressId」除外?我找不到類似於HasColumnName的方法,就像非導航屬性一樣。

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

回答

0

您可以使用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

+0

我在EF7中看不到.Map()方法。 – SkipHarris

+0

您是否需要使用FluentAPI?我試圖在這裏找到一種方法,猜測這不適用於EF7 – jpgrassi

+0

'ForeignKey'屬性與'.HasForeignKey()'方法的組合在EF7中似乎不起作用。 – SkipHarris

0

你可以先從modelBuilder.Entity<House>().Metadata.GetProperties()列表中獲取屬性,然後設置其名稱

property.Relational().ColumnName = "YouCustomId"