2

我一直在为实体框架使用 Code First 方法。我有一个 Event 类、一个 Band 类和一个 EventBands 类,它们映射了多对多关系。Code First 方法运行良好(当我没有 EventBands 类时),但后来我决定我想要多对多表来存储附加值。现在我收到此错误消息:

System.Data.Edm.EdmEntityType: : EntityType 'EventBands' 没有定义键。定义此 EntityType 的键。

System.Data.Edm.EdmEntitySet:EntityType:EntitySet EventBands 基于没有定义键的 EventBands 类型。

错误消息的含义很明显。但是分辨率不是那么明显。我想我必须重写模型绑定方法,但我不完全确定如何用这种方法映射键。

任何帮助将不胜感激,我在下面列出了有问题的课程。

提前致谢,

乔恩

事件:

#region Properties
    private int eventId;
    public int EventId
    {
        get
        {
            return eventId;
        }
        set
        {
            eventId = value;
        }
    }

    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    private string description;
    public string Description
    {
        get
        {
            return description;
        }
        set
        {
            description = value;
        }
    }

    private DateTime startDatetime;
    public DateTime StartDateTime
    {
        get
        {
            return startDatetime;
        }
        set
        {
            startDatetime = value;
        }
    }

    private DateTime endDatetime;
    public DateTime EndDateTime
    {
        get
        {
            return endDatetime;
        }
        set
        {
            endDatetime = value;
        }
    }

    private int venueUserId;
    public int VenueUserId
    {
        get { return venueUserId; }
        set { venueUserId = value; }
    }

    public virtual Venue Venue
    {
        get;
        set;
    }

    public virtual ICollection<EventReview> Reviews
    {
        get;
        set;
    }

    public virtual ICollection<EventBands> EventBands
    {
        get;
        set;
    }

    public virtual ICollection<Fan> Attendees
    {
        get;
        set;
    }
    #endregion

    #region Constructor
    public Event()
    {
        EventBands = new HashSet<EventBands>();
        Attendees = new HashSet<Fan>();
        StartDateTime = DateTime.Now;
        EndDateTime = DateTime.Now.AddDays(14);
    }
    #endregion

乐队:

public class Band : PostableUser
{
    #region Properties
    private int genreGenreId;
    public int GenreGenreId
    {
        get { return genreGenreId; }
        set { genreGenreId = value; }
    }

    public virtual Genre Genre
    {
        get;
        set;
    }

    public virtual ICollection<Album> Albums
    {
        get;
        set;
    }

    public virtual ICollection<BandReview> Reviews
    {
        get;
        set;
    }

    public virtual ICollection<EventBands> EventBands
    {
        get;
        set;
    }
    #endregion

    #region Constructor
    public Band()
    {
        EventBands = new HashSet<EventBands>();
    }
    #endregion
}

事件乐队

#region Properties
    private int eventEventId;
    public int EventEventId
    {
        get { return eventEventId; }
        set { eventEventId = value; }
    }

    public virtual Event Event
    {
        get;
        set;
    }

    private int bandUserId;
    public int BandUserId
    {
        get { return bandUserId; }
        set { bandUserId = value; }
    }

    public virtual Band Band
    {
        get;
        set;
    }

    private DateTime startDateTime;
    public DateTime StartDateTime
    {
        get { return startDateTime; }
        set { startDateTime = value; }
    }

    private DateTime endDateTime;
    public DateTime EndDateTime
    {
        get { return endDateTime; }
        set { endDateTime = value; }
    }
    #endregion

BandUserId 继承自 User 基类。

4

1 回答 1

1

我最终通过在我的 DataContext 类中覆盖 OnModelCreating 方法来完成这项工作。

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new AlbumConfiguration());
        modelBuilder.Configurations.Add(new BandConfiguration());
        modelBuilder.Configurations.Add(new CityConfiguration());
        modelBuilder.Configurations.Add(new CommentConfiguration());
        modelBuilder.Configurations.Add(new CountryConfiguration());
        modelBuilder.Configurations.Add(new CountyConfiguration());
        modelBuilder.Configurations.Add(new EventBandsConfiguration());
        modelBuilder.Configurations.Add(new EventFansConfiguration());
        modelBuilder.Configurations.Add(new EventConfiguration());
        modelBuilder.Configurations.Add(new FanConfiguration());
        modelBuilder.Configurations.Add(new GenreConfiguration());
        modelBuilder.Configurations.Add(new PostConfiguration());
        modelBuilder.Configurations.Add(new RecordLabelConfiguration());
        modelBuilder.Configurations.Add(new ReviewConfiguration());
        modelBuilder.Configurations.Add(new TrackConfiguration());
        modelBuilder.Configurations.Add(new UserConfiguration());
        modelBuilder.Configurations.Add(new VenueConfiguration());
    }

配置类包含主键、复合键、外键和任何其他属性的映射。

活动配置:

public class EventConfiguration : EntityTypeConfiguration<Event>
{
    public EventConfiguration()
    {
        #region Primary Key
        this.HasKey(x => x.EventId);
        #endregion

        #region Foreign Keys
        this.HasRequired(x => x.Venue)
            .WithMany()
            .HasForeignKey(x => x.VenueId)
            .WillCascadeOnDelete(false);
        #endregion

        #region Properties
        this.Property(x => x.Description).IsRequired().HasColumnType("nvarchar");
        this.Property(x => x.EndDateTime).IsRequired();
        this.Property(x => x.Name).IsRequired().HasColumnType("nvarchar");
        this.Property(x => x.StartDateTime).IsRequired();
        #endregion
    }
}

事件频段配置:

public class EventBandsConfiguration : EntityTypeConfiguration<EventBands>
{
    public EventBandsConfiguration()
    {
        #region Primary Key
        this.HasKey(x => new { x.BandId, x.EventId });
        #endregion

        #region Foreign Keys
        this.HasRequired(x => x.Band)
            .WithMany()
            .HasForeignKey(x => x.BandId)
            .WillCascadeOnDelete(false);
        this.HasRequired(x => x.Event)
            .WithMany()
            .HasForeignKey(x => x.EventId)
            .WillCascadeOnDelete(false);
        #endregion

        #region Properties
        this.Property(x => x.StartDateTime).IsRequired();
        this.Property(x => x.EndDateTime).IsRequired();
        #endregion
    }
}

用户配置:

public UserConfiguration()
    {
        #region Primary Key
        this.HasKey(x => x.UserId);
        #endregion

        #region Foreign Keys
        this.HasRequired(x => x.City)
            .WithMany()
            .HasForeignKey(x => x.CityId)
            .WillCascadeOnDelete(false);
        #endregion

        #region Properties
        this.Property(x => x.UserName);
        this.Property(x => x.LoweredUserName);
        this.Property(x => x.ApplicationName);
        this.Property(x => x.Email);
        this.Property(x => x.Comment);
        this.Property(x => x.Password);
        this.Property(x => x.PasswordQuestion);
        this.Property(x => x.PasswordAnswer);
        this.Property(x => x.IsApproved);
        this.Property(x => x.LastActivityDate);
        this.Property(x => x.LastLoginDate);
        this.Property(x => x.LastPasswordChangedDate);
        this.Property(x => x.CreationDate);
        this.Property(x => x.IsOnline);
        this.Property(x => x.IsLockedOut);
        this.Property(x => x.LastLockedOutDate);
        this.Property(x => x.FailedPasswordAttemptCount);
        this.Property(x => x.FailedPasswordAttemptWindowStart);
        this.Property(x => x.FailedPasswordAnswerAttemptCount);
        this.Property(x => x.FailedPasswordAnswerAttemptWindowStart);
        this.Property(x => x.MobileAlias);
        this.Property(x => x.IsAnonymous);
        this.Property(x => x.Description);
        this.Property(x => x.Website);
        #endregion

        #region Inheritance Mapping
        this.Map<Fan>(x => x.Requires("UserType").HasValue("Fan"))
            .Map<Band>(x => x.Requires("UserType").HasValue("Band"))
            .Map<Venue>(x => x.Requires("UserType").HasValue("Venue"));
        #endregion
    }
}

频段配置

public class BandConfiguration : EntityTypeConfiguration<Band>
{
    public BandConfiguration()
    {
        #region Foreign Keys
        this.HasRequired(x => x.Genre)
            .WithMany()
            .HasForeignKey(x => x.GenreId)
            .WillCascadeOnDelete(false);
        #endregion
    }
}
于 2011-02-24T09:25:01.273 回答