C# 实体框架5代码优先无法使模型工作
在这一点上,我的头发再次撕裂…首先使用EF5代码,在代码编译中构建模型,因此它在语法上是正确的,但当代码构建模型时,我会遇到一个异常。这是实体类(我也有vaidation属性,但为了可读性,在这里删除了它们): Profiles实体非常简单:C# 实体框架5代码优先无法使模型工作,c#,entity-framework,code-first,C#,Entity Framework,Code First,在这一点上,我的头发再次撕裂…首先使用EF5代码,在代码编译中构建模型,因此它在语法上是正确的,但当代码构建模型时,我会遇到一个异常。这是实体类(我也有vaidation属性,但为了可读性,在这里删除了它们): Profiles实体非常简单: [Table("PROFILE")] public class Profile : IPEntity { [Key, Column(Order = 0)] [ForeignKey("UserId")] public long Use
[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;
}
这件事我已经讲了两三天了,如果有人能发现我的错误,我将不胜感激
谢谢,
彼得
更新:我在阅读中发现了一个愚蠢的错误,因为我声明了一些内容作为字段而不是属性……但现在我得到了一个不同的异常,我不明白:
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);
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
以及Profile_map类,包括:
this.HasMany(t => t.Profiles)
.WithRequired(t => t.User)
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
由于我必须使用现有的数据库,我一直坚持将属性“UserId”作为两个表中的外键(在用户表中,它是Profiles表的外键,在Profiles表中,它是User表的外键)。我在这两个表中都添加了.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新手,但我找不到问题(好吧,反正还没有…)
再次感谢
public User User;
应该是属性而不是字段-与所有其他字段一样:)
最好使用virtual
(允许延迟加载),因为您已将所有导航属性标记为virtual
编辑有关更新的信息
异常涉及导航属性
用户ID
,并抱怨它不是“有效的导航属性”。实际上,它不是有效的导航属性。该异常表示您可能在WithRequired
方法中使用了UserId
(而不是User
)。你应该仔细看看。Peter,关于你对两个“UserId”列的问题,你说它们都是外键。我认为你是不对的。User.UserId
用[Key]
标记,它是User
类中唯一一个这样标记的用户。它必须是用户
表的主id。在配置文件
类中,您有用户ID
和函数区域
标记为[Key]
。这意味着Profile
表有一个联合主键,其中一个是User
表的UserId
列的外键
那设计非常好。但是,为了在用户
和配置文件
记录之间建立关系,其中配置文件
记录是父记录,您必须在用户
表上有两列引用配置文件
表的两个主键,而且这两列都不能是User
表的UserId
列,否则您将具有循环依赖关系,无法创建任何一条记录
底线是,User
和Profile
表之间没有两种关系,只有一种关系。因此,从您的Profile\u地图类中删除以下块:
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);
那就应该把它修好!;) 是的,谢谢,通过阅读另一个问题,我发现了这一点,但现在我得到了另一个更令人困惑的异常…@PeterHowe:看看我上面关于你后续异常的编辑。我在另一个编辑中添加了更多细节,希望这会揭示一些东西(可能是我做了一些愚蠢的事情…)@PeterHowe:从Profile\u Map
中删除this.HasRequired(t=>t.User)…
映射。如果您已经在User\u Map
中映射了关系,并且它是矛盾的(WithMany()
如果您在User\u Map
中有HasMany
带参数,则不需要它)。同时从配置文件
类中删除[ForeignKey(“UserId”)]
。把这个放在UserId
属性上是错误的,如果你已经映射了与Fluent-API的关系,那么它是多余的。谢谢你,我已经克服了这个错误,但是还有更多错误,我会在发布另一个问题之前尽我所能解决问题!
public User User { get; set; }
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(t => t.UserId)
.WillCascadeOnDelete(false);