EF 4 Code First - 我该如何建模?

时间:2013-01-06 08:23:15

标签: entity-framework entity-framework-4 ef-code-first

我正在尝试EF和Code First方法

我有一个类似

的帐户模型
public class Account
{
   public virtual int AccountID {get; set;}
   public virtual string AccountName {get; set;}
   public virtual Account ParentAccount {get; set;}
   public virtual Contact AccountOwner {get; set}
}

联系班级是一个简单的班级

public class Contact
{
   public virtual int ContactID {get; set;}
   public virtual string ContactName {get; set;}
}

现在我不知道如何将ID添加到帐户类。

假设我已正确设置了上下文,Account类需要进行哪些修改才能

  1. 我可以添加一个帐户作为另一个帐户的父级

  2. 我可以访问特定帐户的ParentAccount

  3. 我可以访问特定帐户的AccountOwner

  4. 我是新手。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

以下是我将如何解决这个问题。

向您的类添加外键属性。我在谈论ParentAccountIdAccountOwnerId。为了使导航更容易一些,我还向Account添加了一组子帐户,并向Contact添加了一组自有帐户。请注意,没有必要将“普通”属性设为虚拟。只应将导航属性设为虚拟。

public class Account
{
    public int AccountID {get; set;}
    public string AccountName {get; set;}
    public int? ParentAccountId { get; set; }
    public int? AccountOwnerId { get; set; }

    public virtual Account ParentAccount { get; set; }
    public virtual ICollection<Account> ChildAccounts { get; set; }

    public virtual Contact AccountOwner { get; set; }

    public Account()
    {
        ChildAccounts = new List<Account>();
    }
}

public class Contact
{
    public int ContactID { get; set; }
    public string ContactName { get; set; }

    public virtual ICollection<Account> OwnedAccounts { get; set; }

    public Contact()
    {
        OwnedAccounts = new List<Account>();
    }
}

接下来,为Account类创建一个映射,向EF解释如何设置关系。

public class AccountMapping : EntityTypeConfiguration<Account>
{
    public AccountMapping()
    {
        HasOptional(x => x.ParentAccount).WithMany(x => x.ChildAccounts).HasForeignKey(x => x.ParentAccountId);
        HasOptional(x => x.AccountOwner).WithMany(x => x.OwnedAccounts).HasForeignKey(x => x.AccountOwnerId);
    }
}

最后,将映射添加到DbContext类。

public MyContext : DbContext
{
    public DbSet<Account> Accounts { get; set; }
    public DbSet<Contact> Contacts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new AccountMapping());
    }
}

请注意,我假设AccountOwner和ParentAccount是可选的。如果需要,只需将外部属性的类型从int?更改为int,然后将映射中的HasOptional更改为HasRequired

答案 1 :(得分:0)

public class Account
{
   [Key]
   public virtual int AccountID {get; set;}
   public virtual string AccountName {get; set;}
   public virtual Account ParentAccount {get; set;}
   public virtual Contact AccountOwner {get; set}
   public virtual IEnummerable<Account> ChiledAccount {get; set}
}

public class Contact
{
   [Key]
   public virtual int ContactID {get; set;}
   public virtual string ContactName {get; set;}
}

答案 2 :(得分:0)

您可以不使用Fluent API执行此操作。由EF.B'cos维护默认约定,您的映射很简单。

您有帐户(1):联系人(m)关系。

请尝试使用以下型号

public class Account
{
   public int Id {get; set;}
   public string AccountName {get; set;}

   public virtual ICollection<Contact> AccountOwners { get; set; }
}


public class Contact
{
   public int Id {get; set;}
   public string ContactName {get; set;}

   public virtual Account ParentAccount {get; set;}
}

然后您的数据库表将如下所示:

Accounts Table

Id            int             NotNull
AccountName   nvarchar(100)   AllowNull


Contacts Table

Id            int             NotNull
ContactName   nvarchar(100)   AllowNull
Account_Id    int             NotNull

如果您需要进行预先映射,那么您必须学习Fluent API。

我写了一篇关于Fluent API检查How to Use Entity Framework Fluent API ?

的博客文章

我希望这会对你有所帮助。