我試圖做實體框架1對1的映射,我發現一個例子online was here, look for the 'Configure One-to-One relationship using Fluent API section'實體框架1對1的關係時,依賴的實體爲null不會拋出異常
大多數網上的例子有點類似於鏈接...以及我在嘗試實現時閱讀的一些書中。
這裏是我的實體:
public class Student
{
public Student() { }
public int StudentId { get; set; }
public string StudentName { get; set; }
public virtual StudentAddress Address { get; set; }
}
public class StudentAddress
{
public int StudentId { 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; }
}
,包括使用流利的API配置我的數據方面:
public class DataContext : DbContext
{
public DbSet<Student> Student { get; set; }
// public DbSet<StudentAddress> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure StudentId as PK for StudentAddress
modelBuilder.Entity<StudentAddress>()
.HasKey(e => e.StudentId);
// Configure StudentId as FK for StudentAddress
modelBuilder.Entity<Student>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(ad => ad.Student);
}
}
class Program
{
static void Main(string[] args)
{
using (var context = new DataContext())
{
var student = new Student { StudentName = "sample name" };
context.Student.Add(student);
context.SaveChanges();
}
Console.ReadKey();
}
}
在控制檯應用程序,我希望它拋出一個異常,因爲一個學生必須有一個StudentAddress以便保存,但是當我運行應用程序並檢查數據庫時,學生輸入實際上已經保存。我可能會漏掉某些東西......但如果我嘗試在Student類的StudentAddress屬性的頂部添加[Required]屬性,它將引發異常如果我不爲Student Entity提供StudentAddress。
您的反饋/幫助將有很大的幫助,非常感謝。謝謝!
你有它落後。學生地址必須有學生。如果需要StudentAddress來創建學生,那麼您需要創建StudentAddress,因此需要StudentID。如果兩者都必須填充並且關係是1到1,那麼它可能應該是單個表。實際上任何一種人/地址關係都應該是一對多的關係,因爲有很多人擁有超過一個地址。 –
看起來驗證不能用Fluent API進行配置。 –
@DavidCram不,我試圖做的是兩端都需要......這意味着你不能插入一個沒有地址的學生,反之亦然(儘管它只在EF中,因爲你實際上不能在SQL中這樣做)無論如何,應該發生的是,當你調用SaveChanges時它會拋出一個異常? –