的ComplexType应该是一个解决方案,但遗憾的是:
复杂类型不能包含导航属性。 Source
变通方法的列表:
解决方法与表分裂
public class Person
{
public int PersonID { get; set; }
public string Name { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
public Int32 ID { get; set; }
public string Province { get; set; }
public virtual City City { get; set; }
}
public class City
{
public Int32 CityID { get; set; }
public string Name { get; set; }
}
public class MappingContext : DbContext
{
public DbSet<Person> Persons { get; set; }
public DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Address>()
.HasKey(t => t.ID)
.HasOptional(t => t.City)
.WithMany()
.Map(t => t.MapKey("CityID"));
modelBuilder.Entity<Address>()
.Property(t => t.ID)
.HasColumnName("PersonID");
modelBuilder.Entity<Person>()
.HasKey(t => t.PersonID)
.HasRequired(t => t.Address)
.WithRequiredPrincipal();
modelBuilder.Entity<Person>().ToTable("TB_PERSON");
modelBuilder.Entity<Address>().ToTable("TB_PERSON");
modelBuilder.Entity<City>()
.HasKey(t => t.CityID)
.ToTable("City");
}
}
[使用方法]
using (var db = new MappingContext())
{
var person = db.Persons.FirstOrDefault();
var cityName = person.Address.City.Name;
var address = db.Addresses.FirstOrDefault();
var personName = address.Person.Name;
}
[数据库]
CREATE TABLE [dbo].[City](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[TB_PERSON](
[PersonId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[Province] [varchar](50) NULL,
[CityID] [int] NULL
) ON [PRIMARY]
解决方法与表分裂+ TPC继承(可重复使用的地址类)
TB_CUSTOMER与地址列另一个表。
public class Person
{
public int PersonID { get; set; }
public string Name { get; set; }
public virtual PersonAddress Address { get; set; }
}
public class Address
{
public string Province { get; set; }
public virtual City City { get; set; }
}
public class PersonAddress : Address
{
public Int32 PersonID { get; set; }
public virtual Person Person { get; set; }
}
public class CustomerAddress : Address
{
public Int32 CustomerID { get; set; }
}
public class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
public virtual CustomerAddress Address { get; set; }
}
public class City
{
public Int32 CityID { get; set; }
public string Name { get; set; }
}
public class MappingContext : DbContext
{
public DbSet<Person> Persons { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<PersonAddress> PersonAddresses { get; set; }
public DbSet<CustomerAddress> CustomerAddresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonAddress>()
.HasKey(t => t.PersonID)
.HasOptional(t => t.City)
.WithMany()
.Map(t => t.MapKey("CityID"));
modelBuilder.Entity<CustomerAddress>()
.HasKey(t => t.CustomerID)
.HasOptional(t => t.City)
.WithMany()
.Map(t => t.MapKey("CityID"));
modelBuilder.Entity<Person>()
.HasRequired(t => t.Address)
.WithRequiredPrincipal(t => t.Person);
modelBuilder.Entity<Customer>()
.HasRequired(t => t.Address)
.WithRequiredPrincipal();
modelBuilder.Entity<Person>().ToTable("TB_PERSON");
modelBuilder.Entity<PersonAddress>().ToTable("TB_PERSON");
modelBuilder.Entity<Customer>().ToTable("TB_CUSTOMER");
modelBuilder.Entity<CustomerAddress>().ToTable("TB_CUSTOMER");
modelBuilder.Entity<City>()
.HasKey(t => t.CityID)
.ToTable("City");
}
}
解决方法与IAddress
public class Person : IAddress
{
public int PersonID { get; set; }
public string Name { get; set; }
public string Province { get; set; }
public virtual City City { get; set; }
[NotMapped]
public IAddress Address { get { return this; } }
}
public interface IAddress
{
string Province { get; set; }
City City { get; set; }
}
public class City
{
public Int32 CityID { get; set; }
public string Name { get; set; }
}
public class MappingContext : DbContext
{
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasKey(t => t.PersonID)
.HasOptional(t => t.City)
.WithMany()
.Map(t => t.MapKey("CityID"));
modelBuilder.Entity<Person>().ToTable("TB_PERSON");
modelBuilder.Entity<City>()
.HasKey(t => t.CityID)
.ToTable("City");
}
}
'public Auth Auth'你的变量名和类型不能相同。你可以通过'myPerson.auth.cardType'和'myPerson.auth'来访问'CardType'和'WhateverField' .whateverField' –
感谢您的回答,但请亲切地说,这不是我要求的 –