我创建了一个以下简单的SQLite数据库用于实验目的:
CREATE TABLE "cities"
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT UNIQUE
);
CREATE TABLE `people`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`city` INTEGER,
`name` TEXT,
`surname` TEXT,
FOREIGN KEY(`city`) REFERENCES `cities`(`id`)
);
然后我使用了@erikej的SQLite Toolbox来生成模型代码。
之后,以下代码正常运行:
var context = new SqliteEfcExampleContext();
var city = new Cities {Name = "Praha"};
context.Cities.Add(city);
context.SaveChanges();
这会立即将城市添加到数据库中,这可以由外部客户端看到。
但是,以下代码不执行任何操作:
var context = new SqliteEfcExampleContext();
var city = context.Cities.Single(c => c.Name == "Praha"); // I know this is unsafe
var person = new People {Name = "Jan"};
city.People.Add(person);
context.People.Add(person);
context.SaveChanges();
更简单:
var context = new SqliteEfcExampleContext();
var person = new People { Name = "Jan" };
context.People.Add(person);
context.SaveChanges();
既不起作用。似乎外键列的存在(即使它可以为空并且未被使用)使得无法在表中插入记录。
添加
context.Entry(person).State = EntityState.Added
context.Update(person)
和
context.Dispose()
没有帮助。
请告诉我我做错了什么。
更新:
一旦我删除了City和People实体用于相互引用的属性(让它们作为简单的独立表工作,外键列可以为空),添加城市也已停止工作。
此外,如果我只是使用context.Cities.Add(city);
添加城市(之后调用context.SaveChanges();
,但这似乎在副作用中没有做任何事情)并尝试稍后使用它来获取它相同的背景 - 它不会找到它。我还尝试使用context.Local
而不仅仅是context
。
同时,context.Database.ExecuteSqlCommand
工作得很好,让我手动插入记录。