我的问题结果是有两个上下文.我重新编写了我的代码,只有一个上下文,我的问题就消失了.
我有一个User,它有一个UserContact列表,它本身有一个ContactOption.它是一个相当简单的1到多个,多对1,中间有UserContact表.
如果我将用户拉出数据库并创建一个新的UserContact,但将ContactOption设置为现有项目(我从数据库中取出),当我保存更改时,实体框架在数据库中创建一个新的ContactOption,基本上是我添加到UserContact的副本(除了它获得一个新的id).
我已经与它斗争了好几个小时,无法解决这个问题.有任何想法吗?
我正在使用Repository模式进行数据库查询,但我确保它们共享相同的上下文.
我用这个将用户拉出数据库:
var user = _context.Users.Include("UserContacts.ContactOption")
.Where(id => id == 1);
Run Code Online (Sandbox Code Playgroud)
并提供以下联系方式:
var co = _context.ContactOptions.FirstOrDefault(c => c.Id == id);
Run Code Online (Sandbox Code Playgroud)
我将ContactOption添加到UserContact,如下所示:
var contactOption = _context.ContactOptions.FirstOrDefault(c => c.Id == someId);
var contact = new UserContact { ContactOption = contactOption };
contact.Data = "someData";
user.UserContacts.Add(contact);
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
public class User
{
[Key]
public int Id { get; set; }
public virtual ICollection<UserContact> UserContacts { get; set; }
}
public class UserContact
{
[Key]
public int Id { get; set; …Run Code Online (Sandbox Code Playgroud) 我似乎无法让EF Code First与SQL Server 2008 R2一起使用.我得到的错误是"无效的对象名称'dbo.Movies'."
它不是自动创建表.
我的连接字符串:
<add name="MovieDBContext"
connectionString="Server=(local); Database=Movies; Trusted_Connection=true; Integrated Security=True"
providerName="System.Data.SqlClient" />
我的模型和上下文类:
public class Movie
{
public int ID { get; set; }
[Required(ErrorMessage = "Title is required")]
public string Title { get; set; }
[Required(ErrorMessage = "Date is required")]
public DateTime ReleaseDate { get; set; }
[Required(ErrorMessage = "Genre must be specified")]
public string Genre { get; set; }
[Required(ErrorMessage = "Price Required")]
[Range(1, 100, ErrorMessage = "Price must be between $1 and …Run Code Online (Sandbox Code Playgroud) 我正在努力解决一个非常乏味的问题.我有一个名为Nation的类和一个名为NationAlly的类
public class Nation
{
public int ID {get; set;}
public int name {get;set;}
public List<NationAlly> NationAllies {get;set;}
}
public class NationAlly
{
public int ID {get; set;}
public int level {get;set;}
public Nation toNation {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用EF 4和CodeFirst与一个名为NationsDB的DbContext来管理我在SQL Server 2008上的数据库.如果我创建一个Nation类型的新对象,我尝试调用countriesDB.SaveChanges,我得到以下异常:
"违反了多重约束.关系'CodeFirstNamespace.NationAlly_toNation'的角色'NationAlly_toNation_Target'具有多重性1或0..1."
我试图用NationAllies字段保存Nation字段为null并且不抛出此异常,数据库中的country表获取所有正确的值.
在我的数据库中,表Nation有2个字段:ID(主键),名称表NationAlly有3个字段:ID(主键),level,NationID这两个表链接的关系是NationAlly.NationID是外键和Nation .ID是主键.
不奇怪吗?在我眼中,NationAlly表应该有一个名为NationID1的字段,另一个叫做NationID2,以创建一个国家和其他国家名单之间的"关系".
我做错了什么?
是否可以仅使用数据注释在Entity Framework 4.1(Code First方法)中定义多对多关系,而无需使用模型构建器?
例如,类似于:
Product = { Id, Name, ... }
Category = { Id, Name, ... }
ProductCategory = { ProductId, CategoryId }
Run Code Online (Sandbox Code Playgroud)
你得到了照片.
我不希望ProductCategory在上下文中有两个多对一的中间实体,因为我没有任何额外的数据,只有两个FK.此外,我应该能够为中间表定义表名,以便与现有数据库一起使用.
entity-framework code-first data-annotations ef-code-first entity-framework-4.1
有时,样本数据很重要,但由于许多相关表格而无法生成.因此,在Entity Framework Code First中,我认为将它们插入DropCreateDatabaseIfModelChanges :: Seed()是一种优雅的方式.
但有没有办法将现有数据从数据库导出回字符串作为插入poco对象的C#/ VB语句?
如果它有效,我们可以使用它来优雅地备份数据,或者通过场景保存到多个.cs,根据需要切换它们以更好地进行测试等.
var students = new List<Student>
{
new Student { FirstMidName = "Carson", LastName = "Alexander", },
new Student { FirstMidName = "Meredith", LastName = "Alonso", },
new Student { FirstMidName = "Arturo", LastName = "Anand", },
// ...
};
students.ForEach(s => context.Students.Add(s));
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud) 我正在使用代码第一实体框架,我想知道如何在创建数据库时运行一些代码,以便我可以用一些数据填充我的数据库.(请注意,我要求创建数据库,而不是每次应用程序启动时).
有人知道我可以使用哪种方法或事件吗?
我在我的DbContext上覆盖了SaveChanges以实现审计日志.使用多对多关系或独立关联相对容易,因为EF为这些关系的任何更改创建了ObjectStateEntries.
我正在使用外键关联,当实体之间的关系发生变化时,所有得到的是ObjectStateEnty,例如实体"Title"的"PublisherID"属性已更改.对于人类而言,这显然是Title实体中的外键,但我如何在运行时确定它?有没有办法将此更改转换为"PublisherID"属性,以使外键所代表的实体成为EntityKey?
我假设我正在处理看起来像这样的实体:
public sealed class Publisher
{
public Guid ID { get; set; }
public string Name { get; set; }
public ICollection<Title> Titles { get; set; }
}
public class Title
{
public Guid ID { get; set; }
public string Name { get; set; }
public Guid? PublisherID { get; set; }
public Publisher Publisher { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有EF EntityConfiguration代码,用于定义关系和外键:
public TitleConfiguration()
{
HasOptional<Publisher>(t => t.Publisher).WithMany(
p => p.Titles).HasForeignKey(t => t.PublisherID);
}
Run Code Online (Sandbox Code Playgroud)
我现在正在做的事似乎有点太复杂了.我希望有更优雅的方式来实现我的目标.对于ObjectStateEntry中的每个修改过的属性,我查看当前实体的所有ReferentialConstraints,看看是否有任何一个将它用作外键.从SaveChanges()调用以下代码:
private void …Run Code Online (Sandbox Code Playgroud) entity-framework poco code-first ef-code-first entity-framework-4.1
有没有办法将order by子句传递给EF中的DbSet类?
我正在使用C#
我有一个与自己有关系的班级:
public class Person
{
public long ID { get; set; }
public string Name { get; set; }
public virtual Person Mother { get; set; }
public virtual Person Father { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当EF 4.1试图映射这个类时,我得到了以下错误:'无法确定类型'Model.Person'和'Model.person'之间关联的主要结束.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.
我已经尝试了EF 4.1主题- 模型关系的解决方案,但没有成功.
我怎么解决这个问题?
谢谢!
public class Client
{
public Int32 ClientID { get; set; }
public virtual ICollection<Inquiry> InquiryManufacturers { get; set; }
public virtual ICollection<Product> Products { get; set; }
public virtual ICollection<Inquiry> InquiryRetailers { get; set; }
}
public class Product
{
public Int32 ProductID { get; set; }
public Int32 ClientID { get; set; }
public virtual Client Client { get; set; }
public virtual ICollection<Inquiry> Inquiries { get; set; }
}
public class Inquiry
{
public Int32 InquiryID { get; …Run Code Online (Sandbox Code Playgroud)