5

以下に示すように、モデルには 3 つのクラスがあります。

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    
    public string UserName { get; set; }

    public ICollection<MartialArtUserProfile> MartialArtUserProfiles { get; set; }
}

[Table("MartialArt")]
public class MartialArt
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public string IconPath { get; set; }

    public string ImagePath { get; set; }

    public ICollection<MartialArtUserProfile> MartialArtUserProfiles { get; set; }
}

public class MartialArtUserProfile
{
    public int UserProfileId { get; set; }
    public UserProfile UserProfile { get; set; }

    public int MartialArtId { get; set; }
    public MartialArt MartialArt { get; set; }
}

そして、以下のように多対多の関係の構成クラスがあります。

public class MartialArtUserProfileConfiguration : EntityTypeConfiguration<MartialArtUserProfile>
{
    public MartialArtUserProfileConfiguration()
    {
        HasKey(a => new { a.MartialArtId, a.UserProfileId });

        HasRequired(a => a.MartialArt)
            .WithMany(s => s.MartialArtUserProfiles)
            .HasForeignKey(a => a.MartialArtId)
            .WillCascadeOnDelete(false);

        HasRequired(a => a.UserProfile)
            .WithMany(p => p.MartialArtUserProfiles)
            .HasForeignKey(a => a.UserProfileId)
            .WillCascadeOnDelete(false);
    }
}

Package Manager ConsoleUpdate-Databaseを実行しようとすると、エンティティの関係を定義した後、次のように表示されます。

モデルの生成中に 1 つ以上の検証エラーが検出されました:

\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'MartialArtUserProfile' にはキーが定義されていません。この EntityType のキーを定義します。\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'MartialArtUserProfiles' は、キーが定義されていないタイプ 'MartialArtUserProfile' に基づいています。

私は何を間違っていますか?

前もって感謝します、

4

3 に答える 3

8

私が理解している場合は、単純に推移テーブルを使用して多対多を作成しようとしています。もしそうなら、これはこれにアプローチする別の方法です。Fluent API を使用して、以下のようにマッピングします。UserProfileToMartialArtテーブル名を任意の名前に変更できます。モデルを作成する代わりに、MartialArtUserProfileEF に妥協点を作成させます。これにより、エラーを回避するためのキーも指定されます。

modelBuilder.Entity<UserProfile>()
    .HasMany(b => b.MartialArts)
    .WithMany(a => a.UserProfiles)
    .Map(m => m.MapLeftKey("MartialArtId")
        .MapRightKey("UserProfileId")
        .ToTable("UserProfileToMartialArt"));

格闘技モデルでは

public IList<UserProfile> UserProfiles { get; set; }   

UserProfile モデルに置く

public IList<MartialArt> MartialArts { get; set; }  
于 2013-03-25T14:44:58.710 に答える
7

次のようにしてみてください。

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string UserName { get; set; }

    [InverseProperty("UserProfiles")]
    public IList<MartialArt> MartialArts { get; set; }
}

[Table("MartialArt")]
public class MartialArt
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public string IconPath { get; set; }

    public string ImagePath { get; set; }

    [InverseProperty("MartialArts")]
    public IList<UserProfile> UserProfiles { get; set; }
}
于 2013-03-10T21:44:27.257 に答える
6

EntityFramework 6.1 では、これを行う必要はありません。2 つの型のコレクションを各クラスに追加するだけで、すべてがうまくいきます。

public class UserProfile {
    public int Id { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<MartialArt> MartialArts { get; set; }

    public UserProfile() {
        MartialArts = new List<MartialArt>();
    }
}

public class MartialArt {
    public int Id { get; set; }
    public string Name { get; set; }
    // *snip*
    public virtual ICollection<UserProfile> UserProfiles { get; set; }

    public MartialArt() {
        UserProfiles = new List<UserProfile>();
    }
}
于 2014-08-29T15:38:39.070 に答える