0

User と UserSession という 2 つのテーブルがあり、これら 2 つのテーブルの間には 2 つの関係があります。

UserSession.User -> User.UserSession

UserSession.SecondaryUser -> User.UserSessions

UserSession は常にユーザーを持ちますが、SecondaryUser を持たない場合があります。

Code First Fluent を使用してこれらの関係をマッピングしようとしています。以下は現在のマッピングとクラス定義です。

ユーザーセッションマップ:

        public UserSessionMap()
    {
        // Primary Key
        this.HasKey(t => t.UserId);

        // Properties
        this.Property(t => t.UserId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        // Table & Column Mappings
        this.ToTable("UserSession");
        this.Property(t => t.UserId).HasColumnName("UserId");
        this.Property(t => t.SecondaryUserId).HasColumnName("SecondaryUserId");
        this.Property(t => t.RoleNameCompanyInfo).HasColumnName("RoleNameCompanyInfo");
        this.Property(t => t.RecordCreate).HasColumnName("RecordCreate");
        this.Property(t => t.RecordUpdate).HasColumnName("RecordUpdate");

        // Relationships
        this.HasRequired(t => t.User).WithRequiredPrincipal(p => p.UserSession);
        this.HasOptional(t => t.SecondaryUser).WithMany(p => p.UserSessions).HasForeignKey(p=>p.SecondaryUserId);

    }

ユーザーマップ:

    public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        ...snip...

        // Table & Column Mappings
        this.ToTable("User");
        this.Property(t => t.Id).HasColumnName("Id");
        ...snip...
    }
}

UserSession エンティティ:

    public partial class UserSession
{
    public int UserId { get; set; }
    [ForeignKey("SecondaryUser")]
    public int? SecondaryUserId { get; set; }
    public string RoleNameCompanyInfo { get; set; }
    public DateTime RecordCreate { get; set; }
    public DateTime RecordUpdate { get; set; }

    public virtual User User { get; set; }
    
    public virtual User SecondaryUser { get; set; }
}

ユーザー エンティティ:

    public partial class User
{
    public User()
    {
        this.Carts = new List<Cart>();
        this.DirectDispenses = new List<DirectDispense>();
        this.Downloads = new List<Download>();
        this.MatchQuestionSessions = new List<MatchQuestionSession>();
        this.Orders = new List<Order>();
        this.UserSessions = new List<UserSession>();
        this.UserUserRoles = new List<UserUserRole>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int CompanyId { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string PasswordSalt { get; set; }
    public string Role { get; set; }
    public bool Active { get; set; }
    public string ColibriUserId { get; set; }
    public Nullable<int> DispenserId { get; set; }
    public Nullable<System.Guid> PasswordResetCode { get; set; }
    public Nullable<System.DateTime> PasswordResetSent { get; set; }
    public System.DateTime RecordUpdate { get; set; }
    public System.DateTime RecordCreate { get; set; }
    public virtual ICollection<Cart> Carts { get; set; }
    public virtual Company Company { get; set; }
    public virtual ICollection<DirectDispense> DirectDispenses { get; set; }
    public virtual ICollection<Download> Downloads { get; set; }
    public virtual ICollection<MatchQuestionSession> MatchQuestionSessions { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
    public virtual ICollection<UserSession> UserSessions { get; set; }
    public virtual UserSession UserSession { get; set; }
    public virtual ICollection<UserUserRole> UserUserRoles { get; set; }
}

[ForeignKey("SecondaryUserId") を SecondaryUser プロパティに追加しようとしましたが、うまくいきませんでした。

基本的に、UserId プロパティと SecondaryUserId プロパティの両方を User の Id プロパティにマップする必要があります。EFが生成しているエラーは次のとおりです。

System.Data.SqlClient.SqlException: 列名 'SecondaryUser_Id' が無効です。

私が考えているのは、User テーブルで SecondaryUser_Id というプロパティを探していることですが、明らかにそこにはありません。User オブジェクトの Id プロパティを調べるように指示するにはどうすればよいですか。私が見つけたすべての記事は、EF が期待する方法で名前が付けられていない PK を FK にマップする方法を示しています。これは、例が見つからない反対のケースのようです。

SO でこの同じエラーを伴う同様の問題がたくさんあるようですが、これらの解決策はどれもうまくいきませんでした。この状況は異なるようです (私が言うように、これはこのエラーの最も一般的な原因の反対のようです)。

4

2 に答える 2

2

これを見て狂ったように一日を過ごし、secondaryUser プロパティを完全に削除するまで行った後でも、同じ問題が発生していました。新しいプロジェクトを開始すると、解決策が得られました。

プロジェクト内には、基本的に UserSession の SecondaryUser プロパティのプロキシである SecondaryUser プロパティを持つ User の部分クラスがあり、EF がマップしようとしていたのはこのプロパティでした。

[NotMapped] 属性をこのプロパティに追加したところ、このエラーはなくなりました。

教訓 - あなたのパーシャルをチェックしてください!

于 2013-07-05T08:42:34.643 に答える
0

解決策は、欠落している列をテーブルに追加することです。単純。

于 2019-01-12T10:50:02.703 に答える