编程语言
首页 > 编程语言> > c#-使用映射的CF Entity Framework中的一对一关系

c#-使用映射的CF Entity Framework中的一对一关系

作者:互联网

我正在使用实体框架5,代码优先.

我有两个域对象(或表).第一个是用户,第二个是UserProfile.一个用户只能拥有一个配置文件,而一个配置文件仅属于一个用户.那是1-1的关系.

这是类….(我简化了代码,使之易于理解,实际上更复杂)

用户

public class User {
    public virtual Int64 UserId { get; set; }
    public virtual UserProfile UserProfile { get; set; }
    public virtual String Username{ get; set; }
    public virtual String Email { get; set; }
    public virtual String Password { get; set; }
}

用户资料

public class UserProfile {
    public virtual Int64 UserId { get; set; }
    public virtual User User { get; set; }
    public virtual Int64 Reputation { get; set; }
    public virtual String WebsiteUrl { get; set; }
}

这是地图.

用户地图

public UserMap() {
    this.Property(t => t.Email)
        .IsRequired()
        .HasMaxLength(100);
    this.Property(t => t.Password)
        .IsRequired()
        .HasMaxLength(15);
    this.Property(t => t.Username)
        .IsRequired()
        .HasMaxLength(15);
}

UserProfileMap

public UserProfileMap()
    {
        this.HasKey(t => t.UserId);
    }

这是上下文…

public class TcContext : DbContext {
    static TcContext () {
        Database.SetInitializer(new TcContextInitializer());
    }
    public DbSet<User> Users { get; set; }
    public DbSet<UserProfile> UserProfiles { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Configurations.Add(new UserMap());
        modelBuilder.Configurations.Add(new UserProfileMap());
    }
}

这是我的错误信息.

Unable to determine the principal end of an association between the types 'Tc.Domain.UserProfile' and 'Tc.Domain.User'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我认为EF应该以这种方式自动确定关系.但这给了我上面的错误信息.我已经对此问题进行了一段时间的研究,但在我的案例中找不到很好的例证.

我的错误在哪里?或者,我应该在地图中定义某种附加关系吗?

解决方法:

我不得不修改UserMap类,如下所示

public UserMap() {
    this.Property(t => t.Email)
        .IsRequired()
        .HasMaxLength(100);
    this.Property(t => t.Password)
        .IsRequired()
        .HasMaxLength(15);
    this.Property(t => t.Username)
        .IsRequired()
        .HasMaxLength(15);
    this.HasOptional(t => t.UserProfile)
        .WithRequired(t => t.User);
}

它基本上说:
    “用户具有可选的实体UserProfile,而后者又具有必需的User实体”

必须在UserProfile中定义键.

标签:ef-code-first,asp-net-mvc-4,entity-framework-5,c
来源: https://codeday.me/bug/20191030/1970678.html