Ano*_*use 3 linq linq-to-entities entity-framework
我的项目中有两个表,分别是User和InvoiceLine.
已经指定一个InvoiceLine
可以User
称为Checker.
我的模特是:
public class InvoiceLine : IEntity
{
public virtual int Id { get; set; }
public virtual int? CheckerId { get; set; }
public virtual string CreatedByUserName { get; set; }
public virtual DateTime CreatedDateTime { get; set; }
public virtual string LastModifiedByUserName { get; set; }
public virtual DateTime? LastModifiedDateTime { get; set; }
// Navigation properties
public virtual User Checker{ get; set; }
}
public class User : IEntity
{
public int Id { get; set; }
public string CreatedByUserName { get; set; }
public DateTime CreatedDateTime { get; set; }
public string LastModifiedByUserName { get; set; }
public DateTime? LastModifiedDateTime { get; set; }
//Navigation properties
public virtual ICollection<InvoiceLine> InvoiceLines { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以这是很好我有0..1从许多关系User
到InvoiceLine
.
这意味着Linq我可以获得用户需要检查的InvoiceLines:
user.InvoiceLines
Run Code Online (Sandbox Code Playgroud)
然而,还有另一个要求,InvoiceLine
也有一个Auditor
所以我修改InvoiceLine
为:
public class InvoiceLine : IEntity
{
public virtual int Id { get; set; }
public virtual int? CheckerId { get; set; }
public virtual int? AuditorId { get; set; }
public virtual string CreatedByUserName { get; set; }
public virtual DateTime CreatedDateTime { get; set; }
public virtual string LastModifiedByUserName { get; set; }
public virtual DateTime? LastModifiedDateTime { get; set; }
// Navigation properties}
public virtual User Checker { get; set; }
public virtual User Auditor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以我真正想要的是:
user.InvoiceLines
Run Code Online (Sandbox Code Playgroud)
并获得Checkers
和Auditors
或可替换地通过让他们seperately:
user.CheckerInvoiceLines
user.AuditorInvoiceLines
Run Code Online (Sandbox Code Playgroud)
user.InvoiceLines
虽然这是可以理解的,但我已经无效了.
可能有人请点我就如何正确的方向使用LINQ获得InvoiceLines
从User
?
编辑更新:
我的模型配置代码如下:
public class VectorCheckContext : DbContext
{
...
public DbSet<InvoiceLine> InvoiceLines { get; set; }
public DbSet<User> Users { get; set; }
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
}
Run Code Online (Sandbox Code Playgroud)
当EF无法通过约定解析它们时,您需要使用流畅的映射来配置关系.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//other mappings
modelBuilder.Entity<InvoiceLine>()
.HasOptional(i => i.Checker)
.WithMany(u => u.CheckerInvoiceLines)
.HasForeignKey(i => i.CheckerId);
modelBuilder.Entity<InvoiceLine>()
.HasOptional(i => i.Auditor)
.WithMany(u => u.AuditorInvoiceLines)
.HasForeignKey(i => i.AuditorId);
}
Run Code Online (Sandbox Code Playgroud)