我正在尝试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类需要进行哪些修改才能
我可以添加一个帐户作为另一个帐户的父级
我可以访问特定帐户的ParentAccount
我可以访问特定帐户的AccountOwner
我是新手。任何帮助将不胜感激
答案 0 :(得分:1)
以下是我将如何解决这个问题。
向您的类添加外键属性。我在谈论ParentAccountId
和AccountOwnerId
。为了使导航更容易一些,我还向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 ?
的博客文章我希望这会对你有所帮助。