gpt4 book ai didi

c# - Entity Framework 5 Code First 中的一对一和一对多关系

转载 作者:太空狗 更新时间:2023-10-29 23:24:41 26 4
gpt4 key购买 nike

我试了一整天才让它工作。我学到了很多关于 EF 的 Fluent API 的知识(例如 this 是一篇很棒的文章),但是我没有成功。

我有三个实体:

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; }
}

并尝试了 HasMany、HasOptional、WithOptional、WithOptionalDependentWithOptionalPrincipial 的所有组合,我可以为 UserHouse 想到

protected override void OnModelCreating(DbModelBuilder modelBuilder)

我就是无法让它工作。我想应该很清楚,我想要什么。一个用户可能有多个地址(首先我想强制至少一个,但现在如果用户可以选择地址我会很高兴......)而房子只有一个地址 - 这是必需的。房子的地址要是能级联删除就好了。

最佳答案

我相信以下内容对您有用

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"));
}
}

请注意,您自己指定外键字段通常会更好,这会让您以后的工作变得更轻松。如果你这样做,那么你可以选择重写 House 如下:

public class House
{
public int HouseId { get; set; }
public int AddressId { get; set; }
public virtual Address Address { get; set; }
}

约定将连接 AddressId 和 Address。如果您在 House 和 Address 之间有一对一的映射,您还可以将它们链接到它们的主键上:

public class House
{
[ForeignKey("Address")]
public int HouseId { get; set; }
public virtual Address Address { get; set; }
}

您提到您希望强制执行至少一个地址 - 这对于一对多关系是不可能的。您只能在用户只有一个地址时执行此操作,此时您可以在 User 类上添加所需的 AddressId 属性。

另一条评论 - 您在代码中将所有内容都虚拟化了。您只需将导航属性设为虚拟即可。

关于c# - Entity Framework 5 Code First 中的一对一和一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com