0

Entity Framework Code First をデータ アクセス レイヤーとして使用する最初のクラス ライブラリを開発しています。

私はこのクラスを持っています:

public class User
{
    public int UserId { get; set; }
    public String Name { get; set; }
    public int Age { get; set; }
    public String City { get; set; }
    public String Country { get; set; }
    public String Email { get; set; }
    public String InterestIn { get; set; }

    public virtual ICollection<User> Friends { get; set; }
    public virtual ICollection<User> FromWhomIsFriend { get; set; }
}

そして今、コンソール アプリケーションでコードをテストしています。

static void Main(string[] args)
{
    Database.SetInitializer(
        new DropCreateDatabaseAlways<AdnLineContext>());

    insertUsersAndFriends();
}

private static void insertUsersAndFriends()
{
    using (var context = new AdnLineContext())
    {

        var user1 = context.Users.Create();
        user1.Name = "User1";
        user1.Age = 25;
        user1.City = "City1";
        user1.Country = "Country1";
        user1.Email = "email_1@email.com";
        user1.InterestIn = "User1's interests";

        var user2 = context.Users.Create();
        user2.Name = "User2";
        user2.Age = 26;
        user2.City = "City2";
        user2.Country = "Country2";
        user2.Email = "email_2@email.com";
        user2.InterestIn = "User2's interests";

        var user3 = context.Users.Create();
        user3.Name = "User3";
        user3.Age = 27;
        user3.City = "City3";
        user3.Country = "Country3";
        user3.Email = "email_3@email.com";
        user3.InterestIn = "User3's interests";

        context.Users.Add(user1);
        context.Users.Add(user2);
        context.Users.Add(user3);

        user1.Friends.Add(user2);
        user3.Friends.Add(user1);

        context.SaveChanges();
    }
}

テスト中なので、データベースはです。

これは私のUserConfigurationクラスです:

public UserConfiguration()
{
    Property(d => d.Name).IsRequired();
    Property(d => d.Age).IsRequired();
    Property(d => d.City).IsRequired();
    Property(d => d.Country).IsRequired();
    Property(d => d.Email).IsRequired();
    Property(d => d.InterestIn).IsRequired();

    HasMany(d => d.MessagesSent).WithRequired(l => l.SentByUser).WillCascadeOnDelete(false);
    HasMany(d => d.MessagesReceived).WithRequired(l => l.SentToUser).WillCascadeOnDelete(false);

    HasMany(d => d.Friends).
        WithMany(d => d.FromWhomIsFriend).
        Map(c =>
            {
                c.ToTable("UserFriends");
                c.MapLeftKey("UserId");
                c.MapRightKey("FriendId");
            });
    HasMany(d => d.WantsToDo).
        WithMany(a => a.Users).
        Map(t =>
            {
                t.ToTable("UserActivities");
                t.MapLeftKey("UserId");
                t.MapRightKey("ActivityId");
            });
}

しかし、 is nulluser1.Friends.Add(user2);であるため、ここで null ポインター例外が発生します。Friends

私は何を間違っていますか?この問題を解決するにはどうすればよいですか?

4

5 に答える 5

1

次のように「List<>」プロパティを宣言する必要があります。

public virtual ICollection<User> Friends { get; set; }

virtual キーワードを使用しない場合、EF はコレクションを初期化しません。あなたの場合、新しいオブジェクトを作成し、プライベート プロパティを使用して新しいオブジェクト用に初期化します。

private ICollection<User> _friends;
public ICollection<User> Friends { 
   get { return _friends ?? (_friends = new List<User>()); }
   set { _friends = value; }
}
于 2013-07-30T14:10:16.737 に答える
0

メンバー Friends を次のように初期化する必要があります。

using (var context = new AdnLineContext())
{
    context.Users.Add(user1);
    context.Users.Add(user2);
    context.Users.Add(user3);

    user1.Friends = new List<User>();
    user1.Friends.Add(user2);
    user3.FromWhomIsFriend.Add(user1);

    context.SaveChanges();
}
于 2013-07-30T14:12:04.587 に答える
-1

Createの方法を使用する必要がありますDbSet-完全に初期化されたプロキシが得られます。

var user1 = context.Users.Create();
user1.Name = "User1";
user1.Age = 25;
user1.City = "City1";
user1.Country = "Country1";
user1.Email = "email_1@email.com";
user1.InterestIn = "User1's interests";
//....

context.Users.Add(user1);

user1.Friends = new List<User>();ハックのようなハードコーディングは解決策ではありません。

于 2013-07-30T14:37:36.490 に答える