簡體   English   中英

MCV3實體框架4代碼優先:將子對象添加到數據庫

[英]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)向我提供了實際上不屬於任何一個類的EmailsUser屬性。

我的問題是:如何在創建時向用戶添加電子郵件地址,以及如何向之前創建的用戶添加電子郵件地址?

在創建用戶時添加電子郵件:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM