与代码优先c的一对零或一关系#

6ljaweal  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(323)

我想先学会使用代码。在图1中,您可以看到我希望从代码优先应用程序变成的eer模型。

现在我试着从我的申请中得到同样的结果。下面你可以看到我从我的应用程序(mysql workbench中的反向工程)成功变成的eer模型。

如您所见,我在创建表“properties”和“grounds”之间的一对零或一关系时遇到了问题。
我有一个抽象的entitybase类

public abstract class EntityBase
{
    public abstract int Id { get; set; }
}

也是继承entitybase类的genericrepository类

public class GenericRepository<T> : IRepository<T> where T : EntityBase

继承dbcontext类的mapdbcontext类。在这个类中,可以看到onmodelcreating方法是“override”。在该方法中,我尝试配置“properties”和“grounds”表之间的关系。

public class MapDBContext : DbContext
{
    public virtual DbSet<Agreements> Agreements { get; set; }
    public virtual DbSet<BuyersRenters> BuyersRenters { get; set; }
    public virtual DbSet<Properties> Properties { get; set; }
    public virtual DbSet<Grounds> Grounds { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Grounds>().HasOptional(s => s.Properties).WithRequired(lu => lu.Grounds);
        base.OnModelCreating(modelBuilder);
    }

    public MapDBContext(string connectionString) : base(connectionString)
    {

    }
}

下面是“properties”和“grounds”表的两个代码第一类(注意:properties类是抽象的):

[Table("eigendommen")]
public abstract class Properties : EntityBase
{
    public override int Id { get; set; }
    [Column("gemeente")]
    [Required]
    public string Town { get; set; }
    [Column("straat")]
    [Required]
    public string Street { get; set; }

    public virtual List<Agreements> Agreements { get; set; }
    public virtual Grounds Grounds { get; set; }
}

[Table("gronden")]
public class Grounds : Properties
{
    [Key]
    public override int Id { get; set; }
    [Column("opp")]
    public double? Surface { get; set; }
    [Column("type")]
    [EnumDataType(typeof(TypeNames))]
    [Required]
    public TypeNames Types { get; set; }

    public virtual Properties Properties { get; set; }
}

有人能帮我做错事吗?我已经搜索了几个小时,尝试了'required'属性,用'?'使其为空,用'foreignkey'属性。但所有这些解决方案要么给出了错误,要么给出了与我现在得到的类似的表。

p3rjfoxz

p3rjfoxz1#

用代码优先c定义一对一和零#
如果你想给学生一个或零个地址。
您可以按照下面的代码操作

public class Student
{
    public Student() { }
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }

}

public class StudentAddress
{
    [ForeignKey("Student")]
    public int StudentAddressId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public int Zipcode { get; set; }
    public string State { get; set; }
    public string Country { get; set; }

    public virtual Student Student { get; set; }
}

必须在dbcontext中定义onmodelcreating,然后定义student和studentaddress之间的关系。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Configure the primary key for the StudentAddresses
    modelBuilder.Entity<StudentAddress>()
        .HasKey(t => t.StudentAddressId);

    // Map one-to-zero or one relationship
    modelBuilder.Entity<StudentAddress>()
        .HasRequired(t => t.Student)
        .WithOptional(t => t.StudentAddress);

 }

相关问题