2017-10-04 61 views
0
public class User 
{ 
    public Account Account { get; set; } 
    public string SomeInfo { get; set; } 
    public Guid Id { get; set; } 
} 

public class Account 
{ 
    public string Name { get; set; } 
} 

public class UserEntityTypeConfiguration : IEntityTypeConfiguration<User> 
{ 
    public virtual void Configure(EntityTypeBuilder<User> builder) 
    { 
     builder.HasKey(x => x.Id); 
     builder 
      .Property(t => t.Id) 
      .ValueGeneratedOnAdd(); 
    } 
} 

我可以映射到一張看起來像這樣的表嗎?如何將兩個類映射到EF Core中的一個表中

| Id | SomeInfo | AccountName | 
------------------------------- 
| 1 | info1 | name1  | 
| 2 | info2 | NULL  | 

和映射後,1將映射到:

User.SomeInfo  is "info1" 
User.Account   is not null 
User.Account.Name is "name1" 

和加載2會導致

User.SomeInfo  is "info2" 
User.Account   is null 

誰能幫助?

+2

你似乎在問[**國有類型**](https://docs.microsoft.com/en-我們/ EF /核心/什麼,是全新/)。或**表拆分**從相同的鏈接。 –

+0

我覺得這更近一步,但它仍然使用一對一的關係。我希望能夠說,如果AccountName == null,那麼不會生成一個Account對象 – chris31389

回答

0

你想要的東西不能按照你想要的方式完成 - 當使用與所有者位於同一個表中的表拆分/所有實體時,它看起來像EFCore要求相關實體不爲空。

我覺得有兩個選項 - 共享主鍵(這將需要兩個表和一個急需/顯式負載加載與委託人的依賴實體)或逐層次表(TPH)繼承(這將需要兩個實體類型)。

共享主鍵:

public class SharedKeyPrincipal 
{ 
    public int Id { get; set; } 
    public int PrincipalProperty { get; set; } 
    public SharedKeyDependent Dependent { get; set; } 
} 
public class SharedKeyDependent 
{ 
    public int Id { get; set; } 
    public int DependentProperty { get; set; } 
    public SharedKeyPrincipal Principal { get; set; } 
} 

modelBuilder.Entity<SharedKeyDependent>() 
    .HasOne(d => d.Principal) 
    .WithOne(p => p.Dependent) 
    .IsRequired() 
    .HasForeignKey<SharedKeyDependent>(d => d.Id); 

var principals = dbContext.Set<SharedKeyPrincipal>() 
    .Include(p => p.Dependent) 
    .ToArray(); 

TPH:

public class InheritanceBaseEntity 
{ 
    public int Id { get; set; } 
    public int BaseEntityProperty { get; set; } 
} 
public class InheritanceDerivedEntity : InheritanceBaseEntity 
{ 
    public int DerivedEntityProperty { get; set; } 
} 

public DbSet<InheritanceBaseEntity> InheritanceBaseEntities { get; set; } 
public DbSet<InheritanceDerivedEntity> InheritanceDerivedEntities { get; set; } 

// use .OfType<InheritanceDerivedEntity>() to get entities that have a 
//  non-null 'value' for the related properties 
var inheritanceEntities = dbContext.Set<InheritanceBaseEntity>().ToArray(); 
+0

感謝您的回答。在第一個示例中,它設置了一對一的關係,我希望帳戶爲空。我似乎無法在EF核心中設置可選的一對一關係:( – chris31389

+0

'SharedKeyDependent'在這種情況下是'Account'並且可以爲空 – Moho

相關問題