1

私のプロジェクトでデータベースを生成する際に、エンティティ フレームワークに問題があると思います。それが1つのケースでしか起こらないのは奇妙です。これは、「ユーザー」と「プレイリスト」の間の 1 対多の関係です。1 人のユーザーが多数のプレイリストを持っています。

これが私のコードです。プロジェクトでいくつかの抽象クラスを使用しました。コアコード

プレイリスト クラス

public virtual User User { get; set; }

ユーザークラス

public virtual ICollection<Playlist> Playlists { get; set; }

完全なコード:

ジェネリック クラス:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace xxx.Areas.admin.Models
{
    public abstract class Generic
    {
        [Display(Name = "Ngày tạo")]
        public DateTime? Created { get; set; }
        [Display(Name = "Lần sửa cuối")]
        public DateTime? Modified { get; set; }
        [Display(Name = "Trạng thái")]
        public bool? IsActive { get; set; }
    }
}

投稿クラス:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace xxx.Areas.admin.Models
{
    public abstract class Post : Generic
    {
        public string Title { get; set; }
        public string Slug { get; set; }
        public string Content { get; set; }
        public string Image { get; set; }
        public int Views { get; set; }
        public bool? AllowComment { get; set; }

        public User ModifiedBy { get; set; }
        public virtual ICollection<Media> Medias { get; set; }
    }
}

AlbumBase クラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using xxx.Areas.admin.Models.SongBase;

namespace xxx.Areas.admin.Models.AlbumBase
{
    public abstract class AlbumBase : Post
    {
        public bool IsPublic { get; set; }
        public bool IsFeatured { get; set; }

        public int OldID { get; set; }
        public string OldSlug { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }
    }
}

プレイリスト クラス:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using xxx.Areas.admin.Models.SongBase;

namespace xxx.Areas.admin.Models.AlbumBase
{
    public class Playlist : AlbumBase
    {
        [Key]
        public int PlaylistID { get; set; }

        public virtual ICollection<Song> Songs { get; set; }
        public virtual ICollection<Folk> Folks { get; set; }
        public virtual ICollection<Instrumental> Instrumentals { get; set; }
        public virtual User User { get; set; }

        public Playlist()
        { }

        public Playlist(string name)
        {
            Title = name;
            Slug = Functions.URLFriendly(Title);
            Views = 0;
            OldID = 0;
            AllowComment = true;
            IsActive = true;
            IsPublic = false;
            IsFeatured = false;
            Created = DateTime.Now;
        }
    }
}

およびユーザークラス:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using baicadicungnamthang.Areas.admin.Models.AlbumBase;
using baicadicungnamthang.Areas.admin.Models.Social;
using baicadicungnamthang.DAL;
using ICB;

namespace xxx.Areas.admin.Models
{
    public class User : Generic
    {
        [Key]
        public int UserID { get; set; }
        [Required(ErrorMessage = "Bạn phải nhập tên tài khoản"), StringLength(50)]
        public string UserName { get; set; }
        public string Password { get; set; }
        public string HashPassword { get; set; }
        [Required(ErrorMessage = "Bạn phải nhập địa chỉ email"), EmailAddress(ErrorMessage = "Địa chỉ email không hợp lệ")]
        public string Email { get; set; }
        [StringLength(50)]
        public string NickName { get; set; }
        public string FullName { get; set; }
        public string Slug { get; set; }
        public string Title { get; set; }
        public string Phone { get; set; }
        public string Avatar { get; set; }
        public DateTime? DOB { get; set; }
        [StringLength(1)]
        public string Gender { get; set; }
        public string Address { get; set; }
        public int TotalLikes { get; set; }
        public int TotalComments { get; set; }
        public int Views { get; set; }
        public string ActivationKey { get; set; }
        public string RecoverKey { get; set; }
        public DateTime? LastLogin { get; set; }
        public int OldID { get; set; }

        public virtual Role Role { get; set; }
        public virtual ICollection<Comment> Comments { get; set; }
        public virtual ICollection<Comment> RateComments { get; set; }
        public virtual ICollection<Playlist> Playlists { get; set; }
        public virtual ICollection<User> Friends { get; set; }
        public virtual ICollection<Message> MessagesSent { get; set; }
        public virtual ICollection<Message> MessagesReceived { get; set; }

        public User()
        {
            Created = DateTime.Now;
            IsActive = false;
            TotalLikes = 0;
            Views = 0;
            OldID = 0;
        }

        public string getAvatar(int w, int h)
        {
            return Functions.getAvatarThumb(UserName, w, h);
        }

        public int getAge()
        {
            if (DOB == null)
            {
                return 0;
            }
            else
            {
                DateTime now = DateTime.Now;
                int age = now.Year - DOB.Value.Year;
                return age;
            }
        }

        public string getGender()
        {
            if (Gender == "M")
            {
                return "Nam";
            }
            else if (Gender == "F")
            {
                return "Nữ";
            }
            else return "";
        }
    }
}

そして、これは最初にコードから生成されたプレイリスト テーブルです。 エンティティ フレームワークは、1 つのキーの 2 つの外部キー列を生成しました

ご覧のとおり、エンティティ フレームワークは、User テーブルの主キー UserID から User_UserID と User_UserID1 の 2 つの列を生成しました。

//public virtual User User { get; という行のコメントを外すと、そのようになります。設定; } してプロジェクトを再構築すると、User_UserID と User_UserID1 の 2 つの列も消えています。

この問題は、ユーザーとプレイリストの関係でのみ発生します。他の 1 対多のシナリオ (ユーザー コメント) では、システムはうまく機能します。

誰でも私に提案をすることができますか?

4

1 に答える 1

1

問題は、同じエンティティ間に複数の関係があることです。

Playlistへの2 つの参照がありますUser(1 つはPlaylistクラスに、もう 1 つはその基本クラスにPost)。

これは、関係をマップする方法がわからないため、Entity Framework を混乱させます。これが、データベースにあまりにも多くの外部キーを作成する理由です。

これを修正するには、InverseProperty属性を使用して、ナビゲーション プロパティをマップする方法を指定します。

public class Playlist : AlbumBase
{
    [Key]
    public int PlaylistID { get; set; }

    [InverseProperty("Playlists")]
    public virtual User User { get; set; }
    ......
于 2013-05-01T15:27:26.953 に答える