2

を使用して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
}
4

1 に答える 1

7

このような関係をナビゲーション プロパティにマップすることはサポートされていません。リレーションは主キーの上にのみマップできます (少なくとも 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
            };
于 2013-03-07T07:55:53.033 に答える