1

これは隠された規則に関するものだと確信していますが、多対多の関係を既存のデータベースにマップしようとすると、常にエラーが発生します。最も簡単な例を次に示します。

[Table("ALRole", SchemaName = "AL")]
public class Role
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

[Table("ALUser", SchemaName = "AL")]
public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}

dbに通常の3つのテーブルがあります。最初の2つは明らかで、3つ目は次のスクリプトで作成されます。

CREATE TABLE AL.ALUsersRoles
(
    RoleID int NOT NULL,
    UserID int NOT NULL,
    CONSTRAINT PK_ALUserRole PRIMARY KEY(RoleID, UserID),
    CONSTRAINT FK_ALUserRole_RoleID FOREIGN KEY(RoleID) REFERENCES AL.ALRole(ID),
    CONSTRAINT FK_ALUserRole_UserID FOREIGN KEY(UserID) REFERENCES AL.ALUser(ID)
)

次に、次のようなコードを使用して、多対多の関係をマッピングしようとします。

// ...I'm in the EntityTypeConfiguration-derived class (User)
HasMany(u => u.Roles)
    .WithMany(r => r.Users)
    .Map(m =>
    {
        m.MapLeftKey(u => u.ID, "UserID");
        m.MapRightKey(r => r.ID, "RoleID");
        ToTable("ALUsersRoles", "AL");
    });

このコードで考えられるすべての組み合わせとバリエーションを試しましたが、常にエラーが発生します。

{"Invalid column name 'Name'.\r\nInvalid ...and so on...

ですから、正しく作成されていないのはテーブルに違いないと思います。何か案は?事前に感謝しますAndreaPS:コードの一部を削除したので、小さなタイプミスがあるかもしれません...

4

2 に答える 2

1

まあ、これはOPと同じように機能します。

        //many-to-many between *Users -> Web_User_Rol <- Web_Rol*
        modelBuilder.Entity<Users>()
            .HasMany(u => u.Web_Rols).WithMany(r => r.Users)
            .Map(t=>t.MapLeftKey("user_id")
                     .MapRightKey("roleID")
                     .ToTable("Web_User_Rol"));
于 2011-10-26T17:23:46.107 に答える
0

オブジェクト モデルや流暢な API コードに問題はありません。私はそれらを使用しましたが、例外なく目的のスキーマを完全に作成しました。あなたの問題は、ここで示したものとは関係のない別のエンティティ (おそらく「名前」プロパティを持つエンティティ) に由来すると思います。それを見つけるには、既存のデータベースを削除 (または名前を変更) し、Code First にデータベースを作成させてから、2 つのデータベースを比較して違いを確認します。

于 2011-01-20T18:34:05.833 に答える