【问题标题】:Entity framework code first inner join with no primary foreign key relationship实体框架代码第一个内连接,没有主外键关系
【发布时间】:2013-03-07 06:51:38
【问题描述】:

我正在使用Entity Framework 5 code first。我正在尝试在 2 个表之间设置内部连接,但我不知道该怎么做。这 2 个表没有主键/外键关联,但它们有一个公共字段 Domain。

tblServer 表:

Server_ID
ServerName
Domain
...
...

tblCommandExecutionServer 表

ServerListID
ServerName
Domain
...
...

这就是我配置 2 个表以映射到某些实体类的方式:

ServerConfiguration 类:

class ServerConfiguration : EntityTypeConfiguration<Server>
{
     internal ServerConfiguration()
     {
          this.ToTable("tblServer");
          this.Property(x => x.Id).HasColumnName("Server_ID");
          this.Property(x => x.Name).HasColumnName("ServerName");
     }
}

CommandExecutionServerConfiguration 类:

class CommandExecutionServerConfiguration : EntityTypeConfiguration<CommandExecutionServer>
{
     internal CommandExecutionServerConfiguration()
     {
          this.ToTable("tblCommandExecutionServer");
          this.Property(x => x.Id).HasColumnName("ServerListID");
          this.Property(x => x.Name).HasColumnName("ServerName");
     }
}

服务器类:

public class Server : IEntity
{
     public int Id { get; set; }

     public string Name { get; set; }

     public string Domain { get; set; }

     public virtual CommandExecutionServer CommandExecutionServer { get; set; }
}

CommandExecutionServer 类:

public class CommandExecutionServer : IEntity
{
     public int Id { get; set; }

     public string Name { get; set; }

     public bool IsActive { get; set; }

     public string Domain { get; set; }

     public virtual Server Server { get; set; }
}

这 2 个表未通过任何列链接。我必须创建以下内部连接,但不确定如何:

SELECT
     ces.ServerName,
     ws.ServerName,
     ws.Domain
FROM
     tblServer ws
          INNER JOIN tblCommandExecutionServer ces ON ws.Domain = ces.Domain
WHERE
     ws.ServerName = 'my-server-name' AND ces.Active = 1;

我的数据库上下文类:

public DbSet<Server> Servers { get; set; }
public DbSet<CommandExecutionServer> CommandExecutionServers { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Configurations.Add(new ServerConfiguration());
     modelBuilder.Configurations.Add(new CommandExecutionServerConfiguration());
}

然后这就是我目前拥有的,我不知道它应该是什么样子?

public Server FindByServerName(string server, bool isActive, string domain)
{
     return DatabaseContext.Servers
          .SingleOrDefault(entity => entity.Name == server
               && entity.IsActive == isActive);
               //&& entity.Domain == server
}

【问题讨论】:

    标签: entity-framework entity-framework-4 ado.net entity-framework-4.1 entity-framework-5


    【解决方案1】:

    不支持将此类关系映射到导航属性。关系只能映射在主键之上(至少 EF 必须相信主体实体中定义的列是 PK)。为了支持您在数据库中的关系 Domain 中的 Server 必须是唯一的,但 EF 还不支持唯一约束。

    您只能使用手动 linq join 来执行类似的查询:

    var query = from s in context.Server
                join c in context.CommandExecutionServer on s.Domain equals c.Domain
                where s.ServerName == server && c.Active == isActive 
                select new {
                    c.ServerName,
                    s.ServerName,
                    s.Domain
                };
    

    【讨论】:

    • 看起来不错。我需要填充其数据的 Server 类和填充其数据的 CommandExecutionServer 类。您能否更新一下您的答案?
    • 您可以使用new { s, c } 代替场投影。
    • 这行得通。我现在唯一需要它来设置返回的 Server 对象以将 CommandExecutionServer 设置为 c。我尝试选择新的{ s, s.CommandExecutionServer = c };,但它不想工作。
    • 我想返回一个 Server 对象,但不确定如何从 IQueryable 中获取这些数据?
    • IQuearyable进行投影时无法直接获取Server对象。您必须先致电ToList
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2014-06-03
    • 2017-10-27
    • 2019-04-15
    相关资源
    最近更新 更多