Mar*_*ser 5 c# one-to-one one-to-many ef-code-first entity-framework-5
我试了整整一天才能搞定这个.我学到了很多关于EF的Fluent API的知识(例如,这是一篇优秀的文章),但是我没有成功.
我有三个实体:
public class Address
{
[Key]
public virtual int AddressId { get; set; }
public virtual string AddressString { get; set; }
}
public class User
{
[Key]
public virtual int UserId { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
public class House
{
[Key]
public virtual int HouseId { get; set; }
public virtual Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并尝试的所有组合HasMany, HasOptional, WithOptional, WithOptionalDependent和WithOptionalPrincipial我能为双方认为User,并House在
protected override void OnModelCreating(DbModelBuilder modelBuilder)
Run Code Online (Sandbox Code Playgroud)
我无法让它发挥作用.我认为应该清楚,我想要什么.一个用户可能有多个地址(首先我要强制至少一个,但现在我会很高兴,如果用户可能有地址可选...)而一个房子只有一个地址 - 这是需要.如果房子的地址被级联删除会很好.
我相信以下内容应该适合您
public class Address
{
public int AddressId { get; set; }
public string AddressString { get; set; }
}
public class User
{
public int UserId { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
public class House
{
public int HouseId { get; set; }
public virtual Address Address { get; set; }
}
public class TestContext : DbContext
{
public DbSet<Address> Addresses { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<House> Houses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(u => u.Addresses).WithMany();
modelBuilder.Entity<House>().HasRequired(h => h.Address).WithOptional().Map(m => m.MapKey("AddressId"));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,通常最好自己指定外键字段,这可以让您以后的生活变得更加轻松。如果您这样做,那么您可以选择将 House 重写为以下内容:
public class House
{
public int HouseId { get; set; }
public int AddressId { get; set; }
public virtual Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Convention 将AddressId 和Address 连接起来。如果 House 和 Address 之间有一对一的映射,您还可以在主键上链接它们:
public class House
{
[ForeignKey("Address")]
public int HouseId { get; set; }
public virtual Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您提到您希望强制执行至少一个地址 - 这对于一对多关系是不可能的。仅当用户只有一个地址时才可以执行此操作,此时您可以在 User 类上添加所需的 AddressId 属性。
另一条评论 - 您在代码中使所有内容都变得虚拟。您只需将导航属性设为虚拟即可。
| 归档时间: |
|
| 查看次数: |
6946 次 |
| 最近记录: |