与 EF Code First 的 0 对一关联
0 To One association with EF Code First
我有一个现有的数据库,想使用 EF Code First 和 Fluent API 将我的实体与数据库中的表映射。
我的桌子是:
Bank(KeyB, BankName) - KeyB 是 PrimaryKey
User(KeyU, UserName, KeyB) - KeyU 是主键,KeyB 有外键,可以为空。
我有这些实体:
class Bank
{
public int Id;
public string Name;
}
class User
{
public int KeyU;
public Bank Bank;
}
我无法让我的 0 到 1 关联流利地工作 API。
我尝试在用户实体中添加一个可为空的 int 属性 BankId(如果可能的话,我希望能够避免这种情况)并将以下代码添加到映射中,但没有成功:
class UserMap:EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.KeyU);
this.Property(u => u.BankId).HasColumnName("KeyB");
this.HasOptional(u => u.Bank).WithMany().HasForeignKey(u => u.BankId);
}
}
User 实例中的 Bank 属性 始终为 null。
你知道如何实现吗?
[更新]
我现在有以下代码仍然不起作用:
class TestCFContext:DbContext
{
public TestCFContext():base(ConnectionString())
{}
private static string ConnectionString()
{return "Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;";}
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
modelBuilder.Configurations.Add(new BankMap());
}
}
class UserMap:EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.Id);
this.Property(u => u.Id).HasColumnName("KeyU");
this.HasOptional(u => u.Bank).WithMany().Map(c => c.MapKey("KeyB"));
this.ToTable("Users");
}
}
class BankMap:EntityTypeConfiguration<Bank>
{
public BankMap()
{
this.HasKey(b => b.Id);
this.Property(b => b.Id).HasColumnName("KeyB");
this.ToTable("Banks");
}
}
class Bank
{
public int Id { get; set; }
public string Name { get; set; }
}
class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Bank Bank { get; set; }
}
static void Main(string[] args)
{
var c = new TestCFContext();
foreach (var u in c.Users)
{
Console.WriteLine(u.Bank.Id);
}
}
导航属性User.Bank
必须是虚拟的,实体本身必须是public,否则Entity Framework无法link Bank
对象。 (从技术上讲,它创建了一个动态的 class 继承实体以确保工作导航属性...)
public class Bank
{
public int KeyB { get; set; }
public string BankName { get; set; }
}
public class User
{
public int KeyU { get; set; }
public string UserName { get; set; }
public virtual Bank Bank { get; set; }
}
使用这些映射,您应该能够检索银行(如果可用)。
public class BankMap : EntityTypeConfiguration<Bank>
{
public BankMap()
{
this.HasKey(b => b.KeyB);
}
}
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.KeyU);
this.HasOptional(u => u.Bank)
.WithMany()
.Map(c => c.MapKey("KeyB"));
}
}
我已经使用当前的 EF 版本 (6.1.2) 对其进行了测试。
我有一个现有的数据库,想使用 EF Code First 和 Fluent API 将我的实体与数据库中的表映射。
我的桌子是:
Bank(KeyB, BankName) - KeyB 是 PrimaryKey
User(KeyU, UserName, KeyB) - KeyU 是主键,KeyB 有外键,可以为空。
我有这些实体:
class Bank
{
public int Id;
public string Name;
}
class User
{
public int KeyU;
public Bank Bank;
}
我无法让我的 0 到 1 关联流利地工作 API。 我尝试在用户实体中添加一个可为空的 int 属性 BankId(如果可能的话,我希望能够避免这种情况)并将以下代码添加到映射中,但没有成功:
class UserMap:EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.KeyU);
this.Property(u => u.BankId).HasColumnName("KeyB");
this.HasOptional(u => u.Bank).WithMany().HasForeignKey(u => u.BankId);
}
}
User 实例中的 Bank 属性 始终为 null。
你知道如何实现吗?
[更新] 我现在有以下代码仍然不起作用:
class TestCFContext:DbContext
{
public TestCFContext():base(ConnectionString())
{}
private static string ConnectionString()
{return "Data Source=.;Initial Catalog=Test;Integrated Security=SSPI;";}
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
modelBuilder.Configurations.Add(new BankMap());
}
}
class UserMap:EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.Id);
this.Property(u => u.Id).HasColumnName("KeyU");
this.HasOptional(u => u.Bank).WithMany().Map(c => c.MapKey("KeyB"));
this.ToTable("Users");
}
}
class BankMap:EntityTypeConfiguration<Bank>
{
public BankMap()
{
this.HasKey(b => b.Id);
this.Property(b => b.Id).HasColumnName("KeyB");
this.ToTable("Banks");
}
}
class Bank
{
public int Id { get; set; }
public string Name { get; set; }
}
class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Bank Bank { get; set; }
}
static void Main(string[] args)
{
var c = new TestCFContext();
foreach (var u in c.Users)
{
Console.WriteLine(u.Bank.Id);
}
}
导航属性User.Bank
必须是虚拟的,实体本身必须是public,否则Entity Framework无法link Bank
对象。 (从技术上讲,它创建了一个动态的 class 继承实体以确保工作导航属性...)
public class Bank
{
public int KeyB { get; set; }
public string BankName { get; set; }
}
public class User
{
public int KeyU { get; set; }
public string UserName { get; set; }
public virtual Bank Bank { get; set; }
}
使用这些映射,您应该能够检索银行(如果可用)。
public class BankMap : EntityTypeConfiguration<Bank>
{
public BankMap()
{
this.HasKey(b => b.KeyB);
}
}
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(u => u.KeyU);
this.HasOptional(u => u.Bank)
.WithMany()
.Map(c => c.MapKey("KeyB"));
}
}
我已经使用当前的 EF 版本 (6.1.2) 对其进行了测试。