我一直在为实体框架使用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
}
EventBands
#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基类。
答案 0 :(得分: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());
}
Configuration类包含主键,复合键,外键和任何其他属性的映射。
活动配置:
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
}
}