1. 多对多的关系
public class Lodging { …
public List<Activity> Acitivities { get; set; } }
public class Activity { …
public List<Lodging> Lodgings { get; set; }
}
在EF中的处理多对多的方式就是会生成第三张表--ActivityLodings表,用于处理这种关系,但是这张表在应用层是透明的。
2. 一对一的关系
不要以为两个类互相引用对方就可以实现一对一,这里存在一个主题的问题,比方说在计划生育的大环境下父亲和孩子是一对一的关系,但是毫无疑问,父亲是主体。这个时候,需要做的就是依赖体的相对应的属性上面声明外键关系以实现区分。
另外如果没有声明外键关联,将会导致运行时错误,EF也将区分不开谁是主体。
public class Person { [Key] public int SocialSecurityNumber { get; set; } … public PersonPhoto Photo { get; set; } }
public class PersonPhoto { [Key] [ForeignKey("PhotoOf")] public int PersonId { get; set; } …
public Person PhotoOf { get; set; }
}
如果是以上的定义方式是1..0的关系,如果是1..1的关系的话,那就应该是在Person类中的Photo属性添加[Required]的声明。不过这种约束是应用层的,在数据库层无法体现这种约束。
如果想要捕获确切的异常,它其实是DbEntityValidationException里面的EntityValidatationErrors里面的
异常处理:
private static void UpdateData() { using (var context = new BreakAwayContext()) { try { var person = new Person { FirstName = "Lorry", LastName = "Zhang" }; context.Persons.Add(person); context.SaveChanges(); } catch (DbEntityValidationException ex) { foreach (DbEntityValidationResult item in ex.EntityValidationErrors) { foreach (DbValidationError error in item.ValidationErrors) { Console.WriteLine("Error Message: " + error.ErrorMessage); Console.WriteLine("Property Name: " + error.PropertyName); } } } } }