EF6 1:可选 + 1:很多

Posted

技术标签:

【中文标题】EF6 1:可选 + 1:很多【英文标题】:EF6 1:optional + 1:many 【发布时间】:2015-01-31 03:05:01 【问题描述】:

EF6 Code First 遇到了一点问题(在 MVC Web 应用程序中)。

在“AccountCircle”中对帐户进行分类的枚举:

public enum AccountType
    
        Circle1,
        Circle2,
        Circle3,
        Circle4,
        Circle5
    

Accounts 的主类:

[Table("Accounts")]
public class AccountModel

  public AccountModel()
  
  

  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int id  get; set; 

  public string Name  get; set; 
  public string EMail  get; set; 

主要的公司模式

[Table("Companys")]
public class CompanyModel

    public CompanyModel()
    
        this.AccountCircle = new AccountCircleModel();
    

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id  get; set; 

    public string Name  get; set; 


    public int? idAccountCircle  get; set; 
    public AccountCircleModel AccountCircle  get; set; 

单圈类:

[Table("AccountCircles")]
public class AccountCircleModel

    public AccountCircleModel()
    
        this.Member = new List<AccountCirleMemberModel>();
    

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id  get; set; 


    public int idCompany  get; set; 
    public CompanyModel Company  get; set; 

    public List<AccountCirleMemberModel> Member  get; set; 

最后但并非最不重要的一点是帐户本身以及附加信息是什么类型的成员:

[Table("AccountCircleMember")]
public class AccountCirleMemberModel

    public AccountCirleMemberModel()
    

    

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id  get; set; 

    public AccountType Typ  get; set; 

    public int idAccount  get; set; 
    public virtual AccountModel Account  get; set; 


    public int idAccountCircle  get; set; 
    public AccountCircleModel AccountCircle  get; set; 

还有 DbContext

public class TestContext : DbContext

    public TestContext()
        : base()
    

    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        // modelBuilder Infos.....

        base.OnModelCreating(modelBuilder);
    



    #region Tables

    public DbSet<AccountModel> Accounts  get; set; 
    public DbSet<CompanyModel> Companys  get; set; 
    public DbSet<AccountCircleModel> AccountCircles  get; set; 

    #endregion

所以有一个公司,它有一个“AccountCircle”类型的可选属性(1:可选) 在 Accountcircle 中,有一个带有单独枚举的 Accounts List (AccountCirleMemberModel 1:many)

我尝试了数百种 modelBuilder 方法来为 EF6 提供必要的信息,但没有成功。 有人提示,给“受保护的覆盖无效 OnModelCreating”方法中的 DbModelBuilder 正确的关系数据?

提前非常感谢! 蒙特

【问题讨论】:

你到底需要什么? 【参考方案1】:

不确定这是否回答了您的问题,但如果您想指定数据库中表之间的关系,请使用 EF Code First,您必须使用修饰符 virtual 为您的“导航”属性 - 映射到另一个桌子。所以代码看起来像:

[Table("Companys")]
public class CompanyModel

    // other properties and the rest of the code here

    public virtual AccountCircleModel AccountCircle  get; set; 


[Table("AccountCircles")]
public class AccountCircleModel

    // other properties and the rest of the code here

    public virtual CompanyModel Company  get; set; 

    public virtual ICollection<AccountCirleMemberModel> Member  get; set; 


[Table("AccountCircleMember")]
public class AccountCirleMemberModel

    // other properties and the rest of the code here

    public virtual AccountModel Account  get; set; 
    public virtual AccountCircleModel AccountCircle  get; set; 

您不需要添加可用作外键的属性 - EF 会处理这些。您可以指定它们,但您必须使用 fluent API 将这些属性映射为特定表的外键。

【讨论】:

以上是关于EF6 1:可选 + 1:很多的主要内容,如果未能解决你的问题,请参考以下文章

Web重温系列:SQLite+EF6实现本地化存储

一键挂载磁盘,可选挂载目录版

Alamofire 打印“可选(数据)”,我怎样才能摆脱“可选”

Python 通用可选参数

Matlab - 可选句柄参数首先用于类似函数的绘图

JavaScript中的可选链接[重复]