繁体   English   中英

实体框架代码第一个内部联接,没有主外键关系

[英]Entity framework code first inner join with no primary foreign key relationship

Entity Framework 5 code first使用Entity Framework 5 code first 我正在尝试在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; }
}

这两个表没有通过任何列链接。 我必须创建以下内部联接,但不确定如何:

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
}

不支持将此类关系映射到导航属性。 关系只能映射在主键之上(至少EF必须相信主体实体中定义的列为PK)。 为了支持数据库中的关系, Server中的Domain必须是唯一的,但是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
            };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM