Entity framework 实体框架取代了delete+;插入一个更新。如何关闭它

Entity framework 实体框架取代了delete+;插入一个更新。如何关闭它,entity-framework,inheritance,ef-code-first,code-first,tph,Entity Framework,Inheritance,Ef Code First,Code First,Tph,我想删除数据库中的一行,然后用相同的Id再次插入它,这听起来很可笑,但下面是一个场景: 域类如下所示: public class SomeClass { public int SomeClassId { get; set; } public string Name { get; set; } public virtual Behavior Behavior { get; set; } } public abstract class Behavior { publ

我想删除数据库中的一行,然后用相同的Id再次插入它,这听起来很可笑,但下面是一个场景:

域类如下所示:

public class SomeClass
{
    public int SomeClassId { get; set; }
    public string Name { get; set; }
    public virtual Behavior Behavior { get; set; }
}

public abstract class Behavior
{
    public int BehaviorId { get; set; }
}

public class BehaviorA : Behavior
{
    public string BehaviorASpecific { get; set; }
}

public class BehaviorB : Behavior
{
    public string BehaviorBSpecific { get; set; }
}
实体上下文是

public class TestContext : DbContext
{
    public DbSet<SomeClass> SomeClasses { get; set; }
    public DbSet<Behavior> Behaviors { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

        modelBuilder.Entity<SomeClass>()
            .HasOptional(s => s.Behavior)
            .WithRequired()
            .WillCascadeOnDelete(true);

    }
}

如何更改此实体行为,以便执行删除和插入而不是更新?

一个可能的解决方案是在两个不同的步骤中进行更改:在
someClass.behavior=new BehaviorB(){BehaviorBSpecific=“behavior B”}插入

someClass.Behaviour = null;
db.SaveChanges();
该行为与数据库模型有关。EF中的行为A和B与相同的EntityRecordInfo相关,并具有相同的EntitySet(行为)。 如果在上下文中创建两个不同的dbset,那么也会有相同的行为,因为DB模型保持不变

编辑
实现1-1关系的类似结果的另一种方法是使用ComplexType。它们也适用于继承。 这里有一个例子

public class TestContext : DbContext
{
    public TestContext(DbConnection connection) : base(connection, true) { }

    public DbSet<Friend> Friends { get; set; }
    public DbSet<LessThanFriend> LessThanFriends { get; set; }
}

public class Friend
{
    public Friend()
    {Address = new FullAddress();}

    public int Id { get; set; }
    public string Name { get; set; }

    public FullAddress Address { get; set; }
}

public class LessThanFriend
{
    public LessThanFriend()
    {Address = new CityAddress();}

    public int Id { get; set; }
    public string Name { get; set; }

    public CityAddress Address { get; set; }
}


[ComplexType]
public class CityAddress
{
    public string Cap { get; set; }
    public string City { get; set; }
}

[ComplexType]
public class FullAddress : CityAddress
{
    public string Street { get; set; }
}
公共类TestContext:DbContext
{
publictestcontext(DbConnection-connection):base(connection,true){}
公共数据库集好友{get;set;}
公共DbSet LessThanFriends{get;set;}
}
公课朋友
{
公众朋友()
{Address=new FullAddress();}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共完整地址{get;set;}
}
公共类LessThanFriend
{
公共LessThanFriend()
{Address=new CityAddress();}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共城市地址{get;set;}
}
[复合类型]
公共类城市地址
{
公共字符串Cap{get;set;}
公共字符串City{get;set;}
}
[复合类型]
公共类完整地址:CityAddress
{
公共字符串Street{get;set;}
}

一个可能的解决方案是在两个不同的步骤中进行更改:在
someClass.Behavior=new BehaviorB(){BehaviorBSpecific=“Behavior B”}之前插入

someClass.Behaviour = null;
db.SaveChanges();
该行为与数据库模型有关。EF中的行为A和B与相同的EntityRecordInfo相关,并具有相同的EntitySet(行为)。 如果在上下文中创建两个不同的dbset,那么也会有相同的行为,因为DB模型保持不变

编辑
实现1-1关系的类似结果的另一种方法是使用ComplexType。它们也适用于继承。 这里有一个例子

public class TestContext : DbContext
{
    public TestContext(DbConnection connection) : base(connection, true) { }

    public DbSet<Friend> Friends { get; set; }
    public DbSet<LessThanFriend> LessThanFriends { get; set; }
}

public class Friend
{
    public Friend()
    {Address = new FullAddress();}

    public int Id { get; set; }
    public string Name { get; set; }

    public FullAddress Address { get; set; }
}

public class LessThanFriend
{
    public LessThanFriend()
    {Address = new CityAddress();}

    public int Id { get; set; }
    public string Name { get; set; }

    public CityAddress Address { get; set; }
}


[ComplexType]
public class CityAddress
{
    public string Cap { get; set; }
    public string City { get; set; }
}

[ComplexType]
public class FullAddress : CityAddress
{
    public string Street { get; set; }
}
公共类TestContext:DbContext
{
publictestcontext(DbConnection-connection):base(connection,true){}
公共数据库集好友{get;set;}
公共DbSet LessThanFriends{get;set;}
}
公课朋友
{
公众朋友()
{Address=new FullAddress();}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共完整地址{get;set;}
}
公共类LessThanFriend
{
公共LessThanFriend()
{Address=new CityAddress();}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共城市地址{get;set;}
}
[复合类型]
公共类城市地址
{
公共字符串Cap{get;set;}
公共字符串City{get;set;}
}
[复合类型]
公共类完整地址:CityAddress
{
公共字符串Street{get;set;}
}

Hi Bubi,谢谢你的回答。但我只是举这个例子来说明我的观点,事实上并不是那么简单,我有一个工作单元来跟踪更改,我不能在用户真正想要保存更改之前保存它们。关于这个模型还有另一个问题。不能将1个行为附加到2个SomeClass。您可以计算将行为用作ComplexType。我记得有一次我尝试了ComplexType,但后来我无法使用继承(我的ComplexType实际上是一个抽象类),您知道将ComplexType与继承一起使用的方法吗?您可以直接使用它们。。。我用一个例子更新了答案我首先要感谢你的努力。但问题是,在两个不同的类中,您使用两种不同的数据类型(Friend中的FullAddress和LessThanFriend中的CityAddress)。我有一个人的属性类型是address(它是抽象的,可以是cityAddress或fullAddress)。这个人是我的第三个朋友,我保存了他的城市地址,但过了一段时间她成了我的朋友,我想把她的地址更新为完整地址。这次我又回到了我和她最初的问题上!!:)嗨,布比,谢谢你的回答。但我只是举这个例子来说明我的观点,事实上并不是那么简单,我有一个工作单元来跟踪更改,我不能在用户真正想要保存更改之前保存它们。关于这个模型还有另一个问题。不能将1个行为附加到2个SomeClass。您可以计算将行为用作ComplexType。我记得有一次我尝试了ComplexType,但后来我无法使用继承(我的ComplexType实际上是一个抽象类),您知道将ComplexType与继承一起使用的方法吗?您可以直接使用它们。。。我用一个例子更新了答案我首先要感谢你的努力。但问题是,在两个不同的类中,您使用两种不同的数据类型(Friend中的FullAddress和LessThanFriend中的CityAddress)。我有一个人的属性类型是address(它是抽象的,可以是cityAddress或fullAddress)。这个人是我的第三个朋友,我保存了他的城市地址,但过了一段时间她成了我的朋友,我想把她的地址更新为完整地址。这次我又回到了我和她最初的问题上!!:)