复杂类型本应该是一种解决方案,但不幸的是:
复杂类型不能包含导航属性。
来源
解决方法列表:
采用表分割的解决方法
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继承(为可重用的Address类)来解决问题
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
Your variable name and type cannot be identical.You could accessCardType
andWhateverField
by doingmyPerson.auth.cardType
andmyPerson.auth.whateverField
- Xander Luciano