1

Entity Framework に問題があります。

public class User : Receiver
{
    public User()
    {
        if (Groups == null)
            Groups = new List<Group>();
        if (Buddies == null)
            Buddies = new List<User>();
    }

    [Required]
    public string PhoneNumber { get; set; }
    [ForeignKey("Guid"), JsonIgnore]
    public IList<User> Buddies { get; set; }
    [ForeignKey("Guid"), JsonIgnore]
    public IList<Group> Groups { get; set; }
}

public class Receiver
{
    public Receiver()
    {
        Guid = Guid.NewGuid();
        Created = DateTime.Now;
    }

    [Key]
    public Guid Guid { get; set; }
    [Required]
    public DateTime Created { get; set; }
}

ユーザーを追加しようとすると...

User user = new User
            {
                Guid = new Guid("8cd094c9-e4df-494e-b991-5cf5cc03d6e3"),
                PhoneNumber = "+4991276460"
            };

        cmc.Receivers.Add(user);

...次のエラーで終了します。

タイプ "System.Collections.Generic.List`1[Project.Models.User]" のオブジェクトは "Project.Models.User" に変換できません。

次の2行をコメントアウトすると:

[ForeignKey("Guid"), JsonIgnore]
    public IList<User> Buddies { get; set; }

...プログラムは正常に動作します。

誰かがこの問題を解決するのを手伝ってくれることを願っています。

そうしないと、次の行でエラーが発生します。cmc.Receivers.Add(user);

4

1 に答える 1

0

あなたのマッピングで...

[ForeignKey("Guid"), JsonIgnore]
public IList<User> Buddies { get; set; }

... がUser.Buddies1 対多の関係の一部であり、User.Guid(= Receiver.Guid) がこの関係の外部キーであることを指定します。ただしUser.Guid、主キーでもあるため、一意である必要があります。その結果、は参照Userのリストを持つことはできずBuddies、単一の参照のみを持つことができます。

マッピングは意味がありませんが、例外はあまり役に立ちませんし、理解するのも困難です。(どういうわけか、EF はBuddies、そのマッピングを持つリストにすることはできず、リストを単一の参照にキャストしたいことを内部的に認識しているようです。私の意見では、マッピングがそもそも無効であることを検出する必要があります。)

1 対多のマッピングを正しく行うには、主キーとは異なる外部キーが必要です。[ForeignKey]注釈を完全に削除することでそれを実現できます...

[JsonIgnore]
public IList<User> Buddies { get; set; }

...その場合、EFはテーブルにデフォルトの外部キーを作成しますReceivers(名前にアンダースコアが含まれる列になりますが、デフォルトの名前が気に入らない場合はFluent APIで名前を変更できます)または追加することによりUserクラスへの独自の外部キー プロパティ:

public Guid? BuddyGuid { get; set; }

[ForeignKey("BuddyGuid"), JsonIgnore]
public IList<User> Buddies { get; set; }
于 2013-06-14T16:50:08.763 に答える