在这个上再次撕掉我的头发...使用EF 5 Code First,在代码中构建模型 - 编译,因此它在语法上是正确的,但是当代码构建模型时我得到一个异常。这是实体类(我也有vaidation属性,但为了便于阅读,已将它们删除):
[Table("USERS")]
public class User : IPEntity
{
#region Constructor (needs to initialize list objects for related entities)
public User()
{
this.Profiles = new List<Profile>();
this.ProfileDivs = new List<ProfileDiv>();
this.ProfileDepts = new List<ProfileDept>();
}
#endregion
#region Entity properties and validation attributes
[Key]
public long UserId { get; set; }
public long PclientId { get; set; }
public string UserName { get; set; }
public string UserDescription { get; set; }
public long? EmpId { get; set; }
public string MustChangePassword { get; set; }
public long? FailedLogins { get; set; }
public DateTime? LastLogin { get; set; }
public long? SequenceNumber { get; set; }
public string AllDivs { get; set; }
public string AllDepts { get; set; }
public string UserRole { get; set; }
public DateTime? BeginSupport { get; set; }
public DateTime? EndSupport { get; set; }
public string OneTimeAccess { get; set; }
public long? ClonedFromUser { get; set; }
public string Email { get; set; }
public string ResetEmail { get; set; }
public DateTime? ResetTimeout { get; set; }
public long? ChallengeFailures { get; set; }
public string PermUserRole { get; set; }
public DateTime? PasswordChangedDate { get; set; }
public virtual ICollection<Profile> Profiles { get; set; }
public virtual ICollection<ProfileDiv> ProfileDivs { get; set; }
public virtual ICollection<ProfileDept> ProfileDepts { get; set; }
public virtual WorkSession WorkSession { get; set; }
}
模型构建器类是:
public class User_Map : EntityTypeConfiguration<User>
{
public User_Map()
{
this.ToTable("USERS");
this.HasKey(t => new { t.UserId });
this.Property(t => t.UserId)
.HasColumnName("USER_ID")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
.IsRequired();
this.Property(t => t.UserName)
.HasColumnName("USERNAME")
.IsRequired()
.HasMaxLength(25);
this.Property(t => t.PclientId)
.HasColumnName("PCLIENT_ID");
this.Property(t => t.EmpId)
.HasColumnName("EMP_ID");
this.Property(t => t.MustChangePassword)
.HasColumnName("MUST_CHANGE_PASSWORD")
.HasMaxLength(1);
this.Property(t => t.UserDescription)
.HasColumnName("USER_DESCRIPTION")
.HasMaxLength(80);
this.Property(t => t.FailedLogins)
.HasColumnName("FAILED_LOGINS");
this.Property(t => t.LastLogin)
.HasColumnName("LAST_LOGIN");
this.Property(t => t.SequenceNumber)
.HasColumnName("SEQUENCE_NUMBER");
this.Property(t => t.AllDivs)
.HasColumnName("ALL_DIVS")
.HasMaxLength(1);
this.Property(t => t.AllDepts)
.HasColumnName("ALL_DEPTS")
.HasMaxLength(1);
this.Property(t => t.UserRole)
.HasColumnName("USER_ROLE")
.HasMaxLength(2);
this.Property(t => t.BeginSupport)
.HasColumnName("BEGIN_SUPPORT");
this.Property(t => t.EndSupport)
.HasColumnName("END_SUPPORT");
this.Property(t => t.OneTimeAccess)
.HasColumnName("ONE_TIME_ACCESS")
.HasMaxLength(1);
this.Property(t => t.ClonedFromUser)
.HasColumnName("CLONED_FROM_USER");
this.Property(t => t.Email)
.HasColumnName("EMAIL")
.HasMaxLength(60);
this.Property(t => t.ResetEmail)
.HasColumnName("RESET_EMAIL")
.HasMaxLength(60);
this.Property(t => t.ResetTimeout)
.HasColumnName("RESET_TIMEOUT");
this.Property(t => t.ChallengeFailures)
.HasColumnName("CHALLENGE_FAILURES");
this.Property(t => t.PermUserRole)
.HasColumnName("PERM_USER_ROLE")
.HasMaxLength(2);
this.Property(t => t.PasswordChangedDate)
.HasColumnName("PASSWORD_CHANGED_DATE");
this.HasOptional(t => t.WorkSession)
.WithRequired(t => t.User);
// TODO: This is syntactically correct but model blows up!
this.HasMany(t => t.Profiles)
.WithRequired(t => t.User)
.HasForeignKey(t => t.UserId);
}
}
当模型构建器类的构造函数执行时,我在上面的行上(在注释之后)抛出以下异常:
The expression 't => t.User' is not a valid property expression.
The expression should represent a property: C#: 't => t.MyProperty'
VB.Net: 'Function(t) t.MyProperty'.
“个人档案”实体非常简单:
[Table("PROFILE")]
public class Profile : IPEntity
{
[Key, Column(Order = 0)]
[ForeignKey("UserId")]
public long UserId { get; set; }
[Key, Column(Order = 1)]
public string FunctionalArea { get; set; }
public int RightsId { get; set; }
public User User;
}
我一直在打这两天或三天,如果有人能发现我的错误,我会非常感激!
谢谢, 彼得
更新:我通过阅读this post发现了一个骨头错误,因为我已经宣布某个字段而不是属性...但现在我得到了一个我不明白的异常:
The navigation property 'UserId' is not a declared property on type 'Profile'.
Verify that it has not been explicitly excluded from the model and that
it is a valid navigation property.
这让我感到困惑,因为UserId是Profile上的声明属性??
第二次更新:
我理解异常但是(因为没有内部异常细节)无法确定它的来源。我将User_map类更改为包括:
this.HasMany(t => t.Profiles)
.WithRequired(t => t.User)
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
和要包含的Profile_map类:
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
由于我必须使用现有的数据库,我坚持使用属性“UserId”作为两个表中的外键(在User表中它是Profiles表的外键,在Profiles表中它是User的外键table。)我添加了.WillCascadeOnDelete(false)以防万一存在某种循环问题。就像我说的那样,我无法确定哪个映射正在吹嘘,对两个构造函数的调用都会毫无例外地传递,只有当上下文中的OnModelCreating的覆盖退出时才抛出异常。这是覆盖:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var mbProfile = new Profile_map();
modelBuilder.Configurations.Add(mbProfile);
var mbUser = new User_Map();
modelBuilder.Configurations.Add(mbUser);
base.OnModelCreating(modelBuilder);
}
我知道我仍然是一名EF新手,但我找不到问题(好吧,还是还没有......)
再次感谢。
答案 0 :(得分:14)
public User User;
应该是属性而不是字段 - 就像所有其他字段一样:)
public User User { get; set; }
最好使用virtual
(允许延迟加载),因为您已将所有导航属性标记为virtual
。
编辑有关更新
的信息该异常涉及导航属性 UserId
,并抱怨它不是“有效的导航属性”。实际上它不是有效的导航属性。该异常表示您可能在UserId
方法中使用了User
(而不是WithRequired
)。你应该仔细看看。
答案 1 :(得分:0)
Peter,关于你在两个“UserId”列中的问题,你说它们都是外键。我不认为你是对的。 User.UserId
标有[Key]
,并且它是User
类中唯一标记为此的方法。它必须是User
表的主要ID。在Profile
课程中,UserId
和FunctionalArea
都标有[Key]
。这意味着Profile
表具有联合主键,其中一个是User
表的UserId
列的外键。
这种设计非常好。但是,为了在User
记录为父项的Profile
和Profile
记录之间建立关系,您必须在User
表上有两列参考Profile
表的两个主键,这些列的NEITHER可能是UserId
表的User
列,否则您将具有循环依赖,无法创建任何记录。< / p>
最重要的是,User
和Profile
表之间没有两个关系,只有一个。因此,请从Profile_map
类中删除以下块:
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
应该立即解决它! ;)