[英]MCV3 Entity Framework 4 Code First: Adding Sub Objects to the db
我試圖首先使用代碼和DbContext生成器來教我自己的MVC3和EF4,所以如果這是一個愚蠢的問題,請原諒我。
基本上我有一個用戶類和一個電子郵件類; 這是因為我希望每個用戶都能擁有多個電子郵件地址。 這些類的設置如下:
public class User
{
[Key]
public int Id { get; set; }
public string User_Name { get; set; }
public string Password { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public virtual ICollection<Email> Emails { get; set; }
}
public class Email
{
[Key]
public int Id { get; set; }
public string Address { get; set; }
public User User { get; set; }
}
我很高興使用MVC3構建的CRUD方法操作用戶類,並以編程方式插入用戶以使用測試數據“播種”db,后者我這樣做是通過重寫DropCreateDatabaseAlways
類中的Seed
方法,如下DropCreateDatabaseAlways
:
public class dbInitializer : DropCreateDatabaseAlways<UserContext>
{
protected override void Seed(UserContext context)
{
var Users = new List<User>
{
new User { User_Name = "uname",
Password = "pword",
First_Name = "fname",
Last_Name = "sname",
}
};
Users.ForEach(u => context.Users.Add(u));
}
}
現在我還想添加這樣的電子郵件地址,並且由於我設置類代碼的方式首先明顯地意識到每個用戶可以有多個電子郵件地址,並且每個電子郵件地址只能屬於一個用戶,因為在創建新用戶時或電子郵件對象intellisense(VS10)向我提供了實際上不屬於任何一個類的Emails
和User
屬性。
我的問題是:如何在創建時向用戶添加電子郵件地址,以及如何向之前創建的用戶添加電子郵件地址?
在創建用戶時添加電子郵件:
protected override void Seed(UserContext context)
{
var Users = new List<User>
{
new User { User_Name = "uname",
Password = "pword",
First_Name = "fname",
Last_Name = "sname",
Emails = new[]
{
new Email { Address = "email1@domain.tld" },
new Email { Address = "email2@domain.tld" },
}
}
};
Users.ForEach(u => context.Users.Add(u));
}
要向以前創建的用戶添加電子郵件,首先需要對用戶的引用:
var user = Users.First();
user.Emails.Add(new Email { Address = "email3@domain.tld" });
回復評論:
new[]
是new Email[]
(新電子郵件陣列)的簡寫。
從技術上講,Eranga的答案更靈活一些。 在我的數據庫中,由於數組是固定長度的,因此在將數據庫初始化為數組后,無法將Email
添加到Emails
集合中。 您需要在Eranga的答案中使用List<Email>
,或者在調用.Add()
之前轉換為類似的列表:
user.Emails.ToList().Add(new Email { Address = "email3@domain.tld" });
我盡可能喜歡數組,因為它們更容易鍵入,在代碼中更簡潔,我通常在對象初始化程序中添加所有內容,因此我不需要在以后再添加它。
也就是說,在保存User
並將其從數據庫中取回之后,您的Emails
集合屬性將不是固定長度的數組,並且可以添加到其中而無需調用.ToList()
。
將電子郵件添加到新用戶
protected override void Seed(UserContext context)
{
var Users = new List<User>
{
new User { User_Name = "uname",
Password = "pword",
First_Name = "fname",
Last_Name = "sname",
Emails = new List<Email> { new Email { Addess = "foo@bar.baz" } }
}
};
Users.ForEach(u => context.Users.Add(u));
}
對於現有用戶也是如此
user.Emails.Add(new Email { Addess = "foo@bar.baz" });
user.Emails.Add
將發出數據庫請求以加載電子郵件集合(即延遲加載)。 替代方法是這樣做
var email = new Email { Addess = "foo@bar.baz", User = user };
context.Emails.Add(email);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.