Nic*_*sen 9 entity-framework code-first
我有以下两种型号
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public int CurrentPeriodId { get; set; }
[ForeignKey("CurrentPeriodId")]
public virtual Period CurrentPeriod { get; set; }
public virtual ICollection<Period> Periods { get; set; }
}
public class Period
{
public int Id { get; set; }
public int AccountId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public virtual Account Account { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行以下查询:
from p in context.Periods
where p.AccountId == accountId &&
p.Id == p.Account.CurrentPeriodId
select p.StartDate
Run Code Online (Sandbox Code Playgroud)
我得到一个sql异常,说"无效的列名Account_AccountId".
我知道我可以从帐户方面处理此问题,并执行类似的操作
from a in context.Accounts
where a.Id == id
select a.CurrentPeriod.StartDate
Run Code Online (Sandbox Code Playgroud)
但我想知道如何设置关系以使其他查询起作用.我错过了什么?
我认为你的实施是错误的.AFAIK,您无法在EF中使用此方法定义一对一关系.
查看生成的数据库,您Account_Id在Periods表中定义了一列.这是你必须定义的:
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public int CurrentPeriodId { get; set; }
public virtual Period CurrentPeriod { get; set; }
public virtual ICollection<Period> Periods { get; set; }
}
public class Period
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,上下文和初始化器:
public class TestContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<Period> Periods { get; set; }
static TestContext()
{
Database.SetInitializer(new DbInitializer());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Account>().HasRequired(a => a.CurrentPeriod).WithMany().HasForeignKey(a => a.CurrentPeriodId);
}
}
class DbInitializer : DropCreateDatabaseAlways<TestContext>
{
protected override void Seed(TestContext context)
{
context.Database.ExecuteSqlCommand("ALTER TABLE Accounts ADD CONSTRAINT uc_Period UNIQUE(CurrentPeriodId)");
}
}
Run Code Online (Sandbox Code Playgroud)
有关One-To-One关系的更多信息,请阅读Manavi先生在此地址的博客系列.
更新:
根据您的评论,如果您想要引用Account来自Period,您可以ForeignKey在帐户的主键上添加一个属性.
一个好的样本位于这个地址(标题为"将一个映射到零或一个关系"的部分)
| 归档时间: |
|
| 查看次数: |
18139 次 |
| 最近记录: |