我的应用程序以 .NET 4.5 为目标并使用 EntityFramework 5.0、Sql Server Compact 4.0。
我正在尝试用一些实体为我的数据库播种,但它一直在抛出:
“System.Data.SqlServerCe.SqlCeException:无法插入外键值,因为对应的主键值不存在。[外键约束名称= FK_dbo.User_dbo.Account_AccountKey]”
这是我的域实体的简化版本:
public class Account
{
public int AccountKey { get; set; }
public string Name { get; set; }
public ICollection<User> Users { get; set; }
}
internal class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
this.HasKey(e => e.AccountKey);
this.Property(e => e.AccountKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(e => e.Name).IsRequired();
}
}
public class User
{
public int UserKey { get; set; }
public string Name { get; set; }
public Account Account { get; set; }
public int AccountKey { get; set; }
}
internal class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(e => e.UserKey);
this.Property(e => e.UserKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(e => e.Name).IsRequired();
this.HasRequired(e => e.Account)
.WithMany(e => e.Users)
.HasForeignKey(e => e.AccountKey);
}
}
public class TestContext : DbContext
{
public TestContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<User> Users { get; set; }
public DbSet<Account> Accounts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
modelBuilder.LoadConfigurations();
}
}
连接字符串:
<connectionStrings>
<add name="TestContext" connectionString="Data Source=|DataDirectory|\TestDb.sdf;" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
这是一个显示问题的示例应用程序:
class Program
{
static void Main(string[] args)
{
try
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TestContext>());
using (var context = new TestContext())
context.Database.Initialize(false);
for (int i = 0; i < 2; i++ )
using (var context = new TestContext())
{
var account1 = new Account()
{
Name = "Account1"
};
var user1 = new User()
{
Name = "User1",
Account = account1
};
context.Accounts.AddOrUpdate(
e => e.Name,
account1
);
context.Users.AddOrUpdate(
e => e.Name,
user1
);
context.SaveChanges();
Console.WriteLine("\nChanges saved.");
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress any key to exit...");
Console.ReadLine();
}
}
Account 类与 User 类是一对多的关系。我的种子方法尝试使用默认用户初始化默认帐户。有人会认为这是 AddOrUpdate 方法的常见用法,但在这种情况下似乎不起作用。如果我只是添加两次相同的帐户,没有用户,它可以正常工作。
有谁可以看到我错过了什么?
这种简单的关系有问题吗?
AddOrUpdate 方法是否设计为在这种情况下工作?
如果不是,那么完成这种播种的正确方法是什么?