您在问题中的原始模型应该可以工作。你可以很容易地测试它:
- 创建新的控制台应用程序(VS 2010)
- 将其命名为“EFTestApp”
- 添加对“EntityFramework.dll”的引用
- 删除 Program.cs 的内容并将以下代码复制到文件中
程序.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
namespace EFTestApp
{
public class User
{
public int Id { get; set; }
public int? DefaultAddressId { get; set; }
[ForeignKey("DefaultAddressId")]
public virtual Address DefaultAddress { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Address> Addresses { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (var context = new Context())
{
try
{
User user = new User() { Addresses = new List<Address>() };
Address address1 = new Address() { Name = "Address1" };
Address address2 = new Address() { Name = "Address2" };
user.Addresses.Add(address1);
user.Addresses.Add(address2);
context.Users.Add(user);
context.SaveChanges();
// user has now 2 addresses in the DB and no DefaultAddress
user.DefaultAddress = address1;
context.SaveChanges();
// user has now address1 as DefaultAddress
user.DefaultAddress = address2;
context.SaveChanges();
// user has now address2 as DefaultAddress
user.DefaultAddress = null;
context.SaveChanges();
// user has now no DefaultAddress again
}
catch (Exception e)
{
throw;
}
}
}
}
}
在 SQL Server Express 中,它创建了一个名为“EFTestApp.Context”的新数据库。您可以在上面的每个 SaveChanges 上设置断点,跨步并观察数据库中的更改。
如果您查看数据库中的关系,那么有两个,并且在Addresses
数据库中的表中是一个外键列User_Id
。
我认为您也可以删除public int? DefaultAddressId { get; set; }
and [ForeignKey("DefaultAddressId")]
。它使用可选的 DefaultAddress 创建相同的数据库表和关系。
也许您希望Address -> User
根据需要建立关系(地址不能在没有用户的情况下单独存在于数据库中)。然后您可以将其添加到 Context 类中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Addresses)
.WithRequired();
}
它使User_Id
Addresses 表中的表不可为空,并默认设置级联删除。因此,当用户被删除时,其所有地址也会被删除。