1

次の状況を考えると、Entity Framework Code-first は、接続テーブルまたは結合テーブルの名前を間違えたり、名前を変更したりします。

public class User () {
 //all fields from Users table
 //...
 //Role collection from Roles table through UserRoleLinks table
 public List<Role> Roles { get; set; }
} 

public class AppUser() {
 //subset of fields from Users through AppUsers View
 //...
 //Role collection from Roles table through UserRoleLinks table
 public List<Role> Roles { get; set; }
}

User と AppUser の両方に、次の構成エントリがあります。

this.HasMany(e => e.Roles)
    .WithMany().Map(m => {
        m.MapLeftKey(a => a.Id, "Users_Id");
        m.MapRightKey(b => b.Id, "Roles_Id");
        m.ToTable("UserRoleLinks");
});

実行時に AppUsers (DbSet<AppUser>) を使用しようとすると、次のエラーが発生します。

「オブジェクト名 'dbo.UserRoleLinks1' が無効です。」「オブジェクト名 'dbo.UserRoleLinks1' が無効です。」

結合テーブル名が既に存在するため、コード ファースト構成によって結合テーブル名がインクリメントされているようです。

どうすればこれを機能させることができますか? テーブルの列のサブセットを取得するより良い方法はありますか?

4

1 に答える 1

0

これはEFではまったく不可能だと思います(コードファーストだけでなく)。これがEDMXで可能であることを証明するまで、コードファーストで試す理由はありません。

ここでの問題は、AppUserがEFの新しいエンティティであるということです。これで、ユーザー<->ロールとAppUser <->ロールの間にM:N関係があり、両方のM:N関係を同じジャンクションテーブルにマップする必要があります。EFは、AppUserが実際にはUserテーブルの上にあるView / Queryのみであることを認識しないため、おそらくこれを無効なマッピングとしてマークします。

AppUserのみを使用して列のサブセットを取得する場合は、代わりにlinqクエリのカスタムタイプへの射影を使用してください。

于 2011-02-14T14:51:44.507 に答える