Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架5代码优先无法使模型工作_C#_Entity Framework_Code First - Fatal编程技术网

C# 实体框架5代码优先无法使模型工作

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

在这一点上,我的头发再次撕裂…首先使用EF5代码,在代码编译中构建模型,因此它在语法上是正确的,但当代码构建模型时,我会遇到一个异常。这是实体类(我也有vaidation属性,但为了可读性,在这里删除了它们):

Profiles实体非常简单:

[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);