实体框架条件实体关系

时间:2015-06-10 06:22:12

标签: c# entity-framework entity-framework-6 entity-relationship

已更新

我有一个通知表

public class Notification
{
   public int SourceType { get; set; }
   public int SourceID { get; set; }
   ....
   // Relations
   public virtual SourceA A { get; set; }
   public virtual SourceB B { get; set; }
}

并且有两个源表

public class SourceA
{
   public int Id { get; set; }
   ...
   public virtual Notification {get; set;}
}
public class SourceB
{
   public int Id { get; set; }
   ...
   public virtual Notification {get; set;}
}

在模型制作者中

       modelBuilder.Entity<SourceA>()
            .HasOptional(c => c.Notification)
            .WithRequired(x => x.A);

       modelBuilder.Entity<SourceB>()
            .HasOptional(c => c.Notification)
            .WithRequired(x => x.B);

这是我的新查询

var myNotification = db.Notifications.Select(x => new Notification()
            {
                A= x.A,
                B= x.B,
                SourceID = x.SourceID,    
            }).ToList(); //error

我收到此错误The entity or complex type 'Notification' cannot be constructed in a LINQ to Entities query

SourceTypesAB。如何根据Source的类型在Notification中建立实体关系?

我现在根据sourcetypes在每个查询中使用linq join加入相关的entites。

我正在做数据库优先模型

1 个答案:

答案 0 :(得分:0)

你可以创建关系0..1到很多 在SourceA和SourceB中,您必须添加一个属性以引用Notification Parent

public virtual Notification { get; set; }

然后在您的Entity Framework配置中创建0..1到多个Relation

HasOptional(x => x.SourceA) .WithRequired(s => s.Notification);

HasOptional(x => x.SourceB) .WithRequired(s => s.Notification);

查询错误

你不能在一个在数据库中执行的查询中选择一个新的,这只适用于内存集合,以获得SourceID的值,你可以做类似的事情

public int SourceID { get return SourceA = !null ? SourceA.ID : SourceB.ID; }