Я пытаюсь научиться использовать Code First. На Рисунке 1 вы можете увидеть модель EER, которую я хочу получить из приложения Code First.
Теперь я попытался получить тот же результат из своего приложения. Ниже вы можете увидеть модель EER, которой я смог стать из своего приложения (с помощью Reverse Engineering в MySQL Workbench).
Как вы можете видеть, у меня есть проблема с созданием от одного до нуля или одного отношения между таблицами "Свойства" и "Основания".
У меня есть абстрактный класс EntityBase
public abstract class EntityBase
{
public abstract int Id { get; set; }
}
Также класс GenericRepository, который наследует класс EntityBase
public class GenericRepository<T> : IRepository<T> where T : EntityBase
Класс MapDBContext, который наследует класс DbContext. Внутри этого класса вы можете видеть, что метод OnModelCreating является "Override". Внутри этого метода я попытался настроить связь между таблицами "Свойства" и "Земля".
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)
{
}
}
Ниже приведены два класса первого класса таблиц "Свойства" и "Основы" (ПРИМЕЧАНИЕ: класс свойств является абстрактным):
[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". Но все эти решения дают либо ошибки, либо аналогичную таблицу для той, которая у меня есть сейчас.
Чтобы определить один к одному и нуль с кодом сначала С#
если вы хотите иметь один или нулевой адрес для учащегося.
Вы можете следовать приведенному ниже коду
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; }
}
вы должны определить OnModelCreating в DbContext, а затем отношение между учеником и учеником.
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);
}