EF6 1:可选+ 1:多

时间:2014-12-02 18:45:47

标签: c# entity-framework

在EF6 Code First(在MVC Web App中)遇到了一点问题。

Enum将帐户分类为" AccountCircle":

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

帐户主要类:

[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
}

所以有一个公司,它有一个类型&#34的可选属性; AccountCircle&#34; (1:可选) 在Accountcircle中,有一个具有单独枚举的帐户列表(AccountCirleMemberModel 1:many)

我尝试了数百种模型构建方法,为EF6提供必要的信息,但没有成功。 有人提示,将DbModelBuilder放入&#34;受保护的覆盖void OnModelCreating&#34;方法正确的关系数据?

非常感谢提前! 蒙特

1 个答案:

答案 0 :(得分:0)

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

[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会照顾它。您可以指定它们,但是您必须使用流畅的API将这些属性映射为特定表的外键。